在Go语言中,字符串是通过一个不可变的字节数组([]byte
)来存储的。具体来说,Go语言中的字符串是一个只读的字节切片([]byte
),它存储的是字符串的UTF-8编码后的字节序列。
Go语言中的字符串底层结构如下:
type stringStruct struct {
str unsafe.Pointer // 指向底层字节数组的指针
len int // 字符串的长度(字节数)
}
str
是一个指向底层字节数组的指针。len
是字符串的字节长度。字节数组:字符串的底层是一个字节数组,存储的是字符串的UTF-8编码后的字节序列。UTF-8是一种变长编码,不同的字符可能占用1到4个字节。
字符:在Go语言中,字符(rune
)是Unicode码点(code point)的别名,实际上是int32
类型的别名。每个字符(rune
)可以对应一个或多个字节。
s := "Hello, 世界"
s
的底层存储是一个字节数组,存储的是 "Hello, 世界"
的UTF-8编码。'H'
占用1个字节,字符 '世'
和 '界'
各占用3个字节。Go语言提供了字符串与字节切片之间的相互转换:
字符串转字节切片:
s := "Hello, 世界"
b := []byte(s) // 将字符串转换为字节切片
字节切片转字符串:
b := []byte{72, 101, 108, 108, 111, 44, 32, 228, 184, 150, 231, 149, 140}
s := string(b) // 将字节切片转换为字符串
[]rune
)的转换字符串转字符切片:
s := "Hello, 世界"
r := []rune(s) // 将字符串转换为字符切片
字符切片转字符串:
r := []rune{'H', 'e', 'l', 'l', 'o', ',', ' ', '世', '界'}
s := string(r) // 将字符切片转换为字符串
rune
)是Unicode码点,每个字符可能对应1到4个字节。这种设计使得Go语言在处理字符串时既高效又灵活,尤其是在处理多语言文本时,能够很好地支持Unicode字符集。