編集#2:あなたは再びあなたの質問の「意味」の新しいタイプを示した:あなたは[]rune
でstring
を検索したいです。
回答:標準ライブラリでは直接サポートされていません。
func search(text []rune, what string) int {
whatRunes := []rune(what)
for i := range text {
found := true
for j := range whatRunes {
if text[i+j] != whatRunes[j] {
found = false
break
}
}
if found {
return i
}
}
return -1
}
テストそれ::
value := []rune("123}456}}789")
result := search(value, "}}")
fmt.Println(result)
出力(Go Playground上でそれを試してみてください):しかし、それは2つのfor
ループでそれを実装するのは簡単です
7
編集:検索することを示す質問を更新しましたの
あなたが簡単な型変換を使用してstring
に[]rune
を変換することができる:あなたはあなたの例で行ったように
toSearchRunes := []rune{'}', '}'}
toSearch := string(toSearchRunes)
そして、そこから上の、あなたがstrings.Index()
を使用することができますが:
if i := strings.Index(text[offset:], toSearch); i > 0 {
print(i)
}
てみてくださいそれはGo Playgroundにあります。
オリジナルの答えは次のとおりです。移動中
string
値はUTF-8でエンコードされたバイトとして格納されています。 strings.Index()
は、指定された部分文字列が見つかると、バイト位置を返します。
だから、基本的には、このバイト位置を縄の位置に変換するだけです。 unicode/utf8
パッケージには、string
:utf8.RuneCountInString()
のラン・カウントまたはラン・レングスを通知するユーティリティ機能が含まれています。
だから基本的にはあなただけのこの関数に部分文字列を渡す必要があります。
offset := 0
text := "123456789}}56"
if i := strings.Index(text[offset:], "}}"); i > 0 {
fmt.Println("byte-pos:", i, "rune-pos:", utf8.RuneCountInString(text[offset:i]))
}
text = "世界}}世界"
if i := strings.Index(text[offset:], "}}"); i > 0 {
fmt.Println("byte-pos:", i, "rune-pos:", utf8.RuneCountInString(text[offset:i]))
}
出力(Go Playground上でそれを試してみてください):
byte-pos: 9 rune-pos: 9
byte-pos: 6 rune-pos: 2
注:offset
もバイト位置にする必要があり、 string
をスライスしたときにtext[offset:]
のようにインデックスがバイトインデックスとして解釈されるためです。
rune
のインデックスを取得する場合は、strings.Index()
の代わりにstrings.IndexRune()
を使用してください。