String Go中子字符串的字符位置

String Go中子字符串的字符位置,string,go,rune,String,Go,Rune,我如何知道子字符串在字符串中的位置,用字符(或符文)而不是字节 字符串。索引(s,sub)将以字节为单位给出位置。使用Unicode时,它与符文中的位置不匹配: 结果:14。预期:7 当然,我可以将s和sub转换为[]符文并手动查找子片,但是有更好的方法吗 与此相关,要获取字符串的第一个n字符,我将执行以下操作:string([]符文[:n])。这是最好的方式吗 导入包后,您可以这样做: 另一个选项: package main import "strings" func r

我如何知道子字符串在字符串中的位置,用字符(或符文)而不是字节

字符串。索引(s,sub)
将以字节为单位给出位置。使用Unicode时,它与符文中的位置不匹配:

结果:14。预期:7

当然,我可以将
s
sub
转换为
[]符文并手动查找子片,但是有更好的方法吗


与此相关,要获取字符串的第一个
n
字符,我将执行以下操作:
string([]符文[:n])
。这是最好的方式吗

导入包后,您可以这样做:

另一个选项:

package main
import "strings"

func runeIndex(s, substr string) int {
   n := strings.Index(s, substr)
   if n == -1 { return -1 }
   r := []rune(s[:n])
   return len(r)
}

func main() {
   n := runeIndex("áéíóúÁÉÍÓÚ", "ÍÓ")
   println(n == 7)
}
func main() {
    s := "áéíóúÁÉÍÓÚ"
    i := strings.Index(s, "ÍÓ")
    fmt.Println(utf8.RuneCountInString(s[:i]))
}
package main
import "strings"

func runeIndex(s, substr string) int {
   n := strings.Index(s, substr)
   if n == -1 { return -1 }
   r := []rune(s[:n])
   return len(r)
}

func main() {
   n := runeIndex("áéíóúÁÉÍÓÚ", "ÍÓ")
   println(n == 7)
}