插件窝 干货文章 Go语言字符串是怎样存储的:字节数组与字符的关系是什么?

Go语言字符串是怎样存储的:字节数组与字符的关系是什么?

字节 字符串 切片 字符 700    来源:    2025-03-16

在Go语言中,字符串是通过一个不可变的字节数组([]byte)来存储的。具体来说,Go语言中的字符串是一个只读的字节切片([]byte),它存储的是字符串的UTF-8编码后的字节序列。

字符串的存储结构

Go语言中的字符串底层结构如下:

type stringStruct struct {
    str unsafe.Pointer // 指向底层字节数组的指针
    len int            // 字符串的长度(字节数)
}
  • str 是一个指向底层字节数组的指针。
  • len 是字符串的字节长度。

字节数组与字符的关系

  1. 字节数组:字符串的底层是一个字节数组,存储的是字符串的UTF-8编码后的字节序列。UTF-8是一种变长编码,不同的字符可能占用1到4个字节。

  2. 字符:在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) // 将字符切片转换为字符串
    

总结

  • Go语言中的字符串是通过一个不可变的字节数组来存储的,存储的是UTF-8编码后的字节序列。
  • 字符(rune)是Unicode码点,每个字符可能对应1到4个字节。
  • 字符串与字节切片、字符切片之间可以相互转换。

这种设计使得Go语言在处理字符串时既高效又灵活,尤其是在处理多语言文本时,能够很好地支持Unicode字符集。