以下哪种方法在性能方面更好?
绝对不是这个。
str := "large text"str2 := []byte(str)for _, s := range str2 { // use s}字符串是不可变的。
[]byte易变。这意味着
[]byte(str)制作副本。因此,上面将复制整个字符串。我发现不知道何时复制字符串是大型字符串性能问题的主要根源。
如果
str2永不更改,则编译器 可以 优化副本。因此,最好像上面这样写,以确保字节数组不会被更改。
str := "large text"for _, s := range []byte(str) { // use s}这样一来,
str2以后就不可能修改并破坏优化。
但这是一个坏主意,因为它将破坏任何多字节字符。见下文。
至于字节/符文转换,由于性能不相等,因此不考虑性能。
c将是一个符文,
str[i]将是一个字节。如果您的字符串包含多字节字符,则必须使用符文。
例如…
package mainimport( "fmt")func main() { str := "snow ☃ man" for i, c := range str { fmt.Printf("c:%c str[i]:%cn", c, str[i]) }}$ go run ~/tmp/test.goc:s str[i]:sc:n str[i]:nc:o str[i]:oc:w str[i]:wc: str[i]: c:☃ str[i]:âc: str[i]: c:m str[i]:mc:a str[i]:ac:n str[i]:n请注意,使用
str[i]会破坏多字节Unipre雪人,它仅包含多字节字符的第一个字节。
无论如何,没有性能差异,因为
range str必须逐个字符地进行工作,而不是逐字节进行。



