删除字符串第一个字符的建议方法是什么?
我查看了字符串方法的文档但我没有看到任何像javascript' String.slice()那样有效的内容。
答案 0 :(得分:14)
在Go中,字符string
是UTF-8编码的Unicode代码点。 UTF-8是可变长度编码。
The Go Programming Language Specification
对于带有范围子句
的语句对于字符串值,"范围"子句迭代Unicode代码 从字节索引0开始的字符串中的点。连续 迭代时,索引值将是第一个字节的索引 连续的UTF-8编码的代码点在字符串中,第二个 符号类型的值将是相应代码的值 点。如果迭代遇到无效的UTF-8序列,则 第二个值将是0xFFFD,Unicode替换字符,和 下一次迭代将在字符串中前进一个字节。
例如,
package main
import "fmt"
func trimLeftChar(s string) string {
for i := range s {
if i > 0 {
return s[i:]
}
}
return s[:0]
}
func main() {
fmt.Printf("%q\n", "Hello, 世界")
fmt.Printf("%q\n", trimLeftChar(""))
fmt.Printf("%q\n", trimLeftChar("H"))
fmt.Printf("%q\n", trimLeftChar("世"))
fmt.Printf("%q\n", trimLeftChar("Hello"))
fmt.Printf("%q\n", trimLeftChar("世界"))
}
游乐场:https://play.golang.org/p/t93M8keTQP_I
输出:
"Hello, 世界"
""
""
""
"ello"
"界"
或者,对于更一般的功能,
package main
import "fmt"
func trimLeftChars(s string, n int) string {
m := 0
for i := range s {
if m >= n {
return s[i:]
}
m++
}
return s[:0]
}
func main() {
fmt.Printf("%q\n", trimLeftChars("", 1))
fmt.Printf("%q\n", trimLeftChars("H", 1))
fmt.Printf("%q\n", trimLeftChars("世", 1))
fmt.Printf("%q\n", trimLeftChars("Hello", 1))
fmt.Printf("%q\n", trimLeftChars("世界", 1))
fmt.Println()
fmt.Printf("%q\n", "Hello, 世界")
fmt.Printf("%q\n", trimLeftChars("Hello, 世界", 0))
fmt.Printf("%q\n", trimLeftChars("Hello, 世界", 1))
fmt.Printf("%q\n", trimLeftChars("Hello, 世界", 7))
fmt.Printf("%q\n", trimLeftChars("Hello, 世界", 8))
fmt.Printf("%q\n", trimLeftChars("Hello, 世界", 9))
fmt.Printf("%q\n", trimLeftChars("Hello, 世界", 10))
}
游乐场:https://play.golang.org/p/ECAHl2FqdhR
输出:
""
""
""
"ello"
"界"
"Hello, 世界"
"Hello, 世界"
"ello, 世界"
"世界"
"界"
""
""
参考文献:
答案 1 :(得分:11)
假设问题使用“character”来引用Go调用的rune,然后使用utf8.DecodeRuneInString获取第一个符文的大小然后切片:
func trimFirstRune(s string) string {
_, i := utf8.DecodeRuneInString(s)
return s[i:]
}
正如peterSO在他的评论中链接的游乐场示例中所示,字符串上的范围也可用于查找第一个符文结束的位置:
func trimFirstRune(s string) string {
for i := range s {
if i > 0 {
// The value i is the index in s of the second
// rune. Slice to remove the first rune.
return s[i:]
}
}
// There are 0 or 1 runes in the string.
return ""
}
答案 2 :(得分:1)
另一个选项是 utf8string
包:
package main
import "golang.org/x/exp/utf8string"
func main() {
s := utf8string.NewString("?????")
t := s.Slice(1, s.RuneCount())
println(t == "????")
}
答案 3 :(得分:-1)
这对我有用:
package main
import "fmt"
func main() {
input := "abcd"
fmt.Println(input[1:])
}
输出是:
bcd
Go Playground上的代码:https://play.golang.org/p/iTv7RpML3LO