Go SDK/src/runtime/string.go

  1. type stringStruct struct {
  2. str unsafe.Pointer // 字符串在常量区的首地址
  3. len int // 字符串长度
  4. }

特性

  1. 一个string类型不管其字符串长度为多少,它在虚拟内存中的大小都是一致的;
    • 在64位系统中占16个字节
      • unsafe.Pointer类型底层为int类型,64位系统中占8字节
      • int类型在64位系统中会编译为int64类型,占8字节
    • 在32位系统中占8字节
      • unsafe.Pointer类型底层为int类型,32位系统中占4字节
      • int类型在32位系统中会编译为int32类型,占4字节
  2. string类型中的指针指向常量区,即字符串的值存储在常量区;
    • 常量区中的内容是只读的,不可修改;
  3. 两个相同的字符串的内存地址相同,即两个string类型中的指针指向同一块常量区;

存储结构

image.png

string与[]byte的区别

  1. string和[]byte的存储结构不同;
    • string:指针+字符串长度;
    • []byte:指针+长度+容量;
  2. []byte的值在虚拟内存区存储,可修改;
  3. string的值在字符串常量区内存储,不可修改;