web-dev-qa-db-ja.com

GolangはPython can?

Pythonは次のように文字列を乗算できます。

Python 3.4.3 (default, Mar 26 2015, 22:03:40)
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> x = 'my new text is this long'
>>> y = '#' * len(x)
>>> y
'########################'
>>>

Golangは何とか同等のことを行うことができますか?

46
Duke Dougal

演算子 _strings.Repeat_ の代わりに関数があります。 Pythonの例のポートです。これを実行できます here

_package main

import (
    "fmt"
    "strings"
    "unicode/utf8"
)

func main() {
    x := "my new text is this long"
    y := strings.Repeat("#", utf8.RuneCountInString(x))
    fmt.Println(x)
    fmt.Println(y)
}
_

utf8.RuneCountInString(x) の代わりに len(x) を使用したことに注意してください。前者は「ルーン」(Unicodeコードポイント)をカウントし、後者はバイトをカウントします。 _"my new text is this long"_の場合、すべての文字が1バイトしかないため、違いは重要ではありませんが、意味を指定する習慣を身に付けるのは良いことです。

_len("ā") //=> 2
utf8.RuneCountInString("ā") //=> 1
_

(Python 2、 len では、プレーン文字列のバイト数をカウントし、Unicode文字列のルーン文字をカウントします(_u'...'_):

_>>> len('ā') #=> 2
>>> len(u'ā') #=> 1
_

Python 3、プレーン文字列areUnicode文字列と len ルーンを数えます;バイトを数えたいなら、文字列を bytearray にエンコードする必要があります:

_>>> len('ā') #=> 1
>>> len('ā'.encode('utf-8')) #=> 2
_

Goには、1種類の文字列しかありません。したがって、変換する必要はありませんが、必要なセマンティクスに一致する関数を選択する必要があります。

80
Mark Reed

はい、できますが、演算子ではなく、標準ライブラリの関数を使用できます。

単純なループでは非常に簡単ですが、標準ライブラリでは高度に最適化されたバージョン strings.Repeat() が提供されます。

あなたの例:

_x := "my new text is this long"
y := strings.Repeat("#", len(x))
fmt.Println(y)
_

Go Playground で試してください。

注:len(x)は、文字列の「バイト」長(バイト数)です(UTF-8エンコーディングでは、Goが文字列をメモリに格納する方法です)。文字数(ルーン文字)が必要な場合は、 utf8.RuneCountInString() を使用します。

13
icza

うん。文字列パッケージには Repeat関数 があります。

2
ShadowRanger