Go语言字符串浅析

Go语言中,字符串就是一个只读(read-only)的,可以包含任意字节(byte)的切片(slice)。由于Go源码文件都是使用UTF-8编码的,所以直接在源码中输入的字符串也都是用UTF-8编码的(前提是字符串里没有byte-level escapes,即字节层面上的转义)。请看下面这个例子:

package main
import "fmt"

func main() {
    s := "日志log"

    fmt.Println(len(s))
}

执行结果:

9

s是一个UTF-8编码的字符串,“日志”两个汉字各占3个字节,所以一共是9个字节。

再看一个例子:

package main
import "fmt"

func main() {
    s:="\xFF\xFF"

    fmt.Println(len(s))
}

执行结果:

2

虽然0xFF不是一个合法的UTF-8编码字符,但是因为字符串可以包含任意字节,所以s仍是一个合法的字符串。

Go语言引入rune类型(实际就是int32)来表示字符(character),“日志log”这个字符串包含了5个字符,9个字节。 可以用for range循环来遍历UTF-8编码字符串的每个字符:

package main
import "fmt"

func main() {
    s := "日志log"
    for index, runeValue := range s {
        fmt.Printf("%#U starts at byte position %d\n", runeValue, index)
    }
}

执行结果:

U+65E5 '日' starts at byte position 0
U+5FD7 '志' starts at byte position 3
U+006C 'l' starts at byte position 6
U+006F 'o' starts at byte position 7
U+0067 'g' starts at byte position 8

参考资料:
Strings, bytes, runes and characters in Go

发表评论

邮箱地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.