2 回答
TA贡献1811条经验 获得超4个赞
索引 astring索引其字节(以 UTF-8 编码 - 这是 Go 在内存中存储字符串的方式),但您想测试第一个字符。
所以你应该得到第一个rune而不是第一个byte。为了提高效率,您可以使用utf8.DecodeRuneInString()which 只解码第一个rune. 如果你需要所有的符文string,你可以使用像all := []rune("I'm a string").
看这个例子:
for _, s := range []string{"asdf", ".asdf", "”asdf"} {
c, _ := utf8.DecodeRuneInString(s)
if c != '.' && c != ',' && c != '?' && c != '“' && c != '”' {
fmt.Println("Ok:", s)
} else {
fmt.Println("Not ok:", s)
}
}
输出(在Go Playground上试试):
Ok: asdf
Not ok: .asdf
Not ok: ”asdf
TA贡献1852条经验 获得超7个赞
值得注意的是,虽然字符串的索引以字节为单位,但range字符串的索引以符文为单位。所以以下也有效:
for _, s := range []string{"asdf", ".asdf", "”asdf"} {
for _, c := range s {
if c != '.' && c != ',' && c != '?' && c != '“' && c != '”' {
fmt.Println("Ok:", s)
} else {
fmt.Println("Not ok:", s)
}
break // we break after the first character regardless
}
}
- 2 回答
- 0 关注
- 296 浏览
添加回答
举报
