当前位置: 首页 > news >正文

Go string 字符串底层逻辑

在 Go 语言中,string 类型的底层结构是一个结构体,包含两个字段:一个指向字节数组的指针和该字节数组的长度。以下是其在 Go 源码中的大致定义:
type stringStruct struct {
   str unsafe.Pointer
   len int
}
str:这是一个指向字节数组的指针,该数组存储着字符串的实际内容。
len:它表示字符串的长度,也就是字节数组中字节的数量。
当你创建一个字符串时,Go 语言会在内存里分配一块连续的区域,用来存放字符串的字节序列。字符串一旦创建,其内容就不可变,而且这块内存区域的大小等同于字符串的长度。
例如:
s := "hello"
在这个例子中,Go 语言会分配一块大小为 5 字节的内存区域,用来存放字符串 "hello" 的字节序列。stringStruct 中的 str 指针会指向这块内存区域的起始地址,len 字段的值则为 5。
当你修改字符串时,Go 语言会重新分配一块内存区域,并将原来的字符串内容复制到新区域中。
例如:
s = s + " world"
在这个例子中,Go 语言会重新分配一块大小为 11 字节的内存区域,并将原来的字符串 "hello" 的内容复制到新区域中,再追加上 " world" 字符串的字节序列。stringStruct 中的 str 指针会指向这块内存区域的起始地址,len 字段的值则为 11。j

举个例子测试下:

package main

import (
	"fmt"
	"unsafe"
)

func main() {
	s := "hello"
	// 打印字符串的长度
	fmt.Printf("Length of s: %d\n", len(s)) // Length of s: 5

	// 打印字符串的底层结构
	strStruct := (*struct {
		str unsafe.Pointer
		len int
	})(unsafe.Pointer(&s))
	fmt.Printf("Pointer to underlying data: %p\n", strStruct.str) // Pointer to underlying data:  0xa60caf
	fmt.Printf("Length of underlying data: %d\n", strStruct.len)  // Length of underlying data: 5
	fmt.Printf(" %v,%v\n", &s, strStruct)                         // 0xc000026070,&{0xa60caf 5}

	// 尝试修改字符串
	s = s + " world"
	// 打印新字符串的底层结构
	newStrStruct := (*struct {
		str unsafe.Pointer
		len int
	})(unsafe.Pointer(&s))
	fmt.Printf("Pointer to new underlying data: %p\n", newStrStruct.str) // Pointer to new underlying data: 0xc00000a0e0
	fmt.Printf("Length of new underlying data: %d\n", newStrStruct.len)  // Length of new underlying data: 11
	fmt.Printf(" %v,%v\n", &s, newStrStruct)                             //  0xc000026070,&{0xc00000a0e0 11}
}

相关文章:

  • MessageBox()
  • AI 实战 - 基于2D图片的三维人脸重建
  • 日语学习-日语知识点小记-构建基础-JLPT-N4N5阶段(22):给与和得到相关用法
  • 力扣——146.LRU缓存
  • 【AD】5-19 PCB阻焊开窗及异形开窗
  • 五、Ultra-Fast-Lane-Detection 训练数据集转换
  • 802.11标准
  • Java8计算集合属性的平均值
  • 一文了解大模型Function Calling
  • 成绩排序(结构体排序)
  • JVM内存结构笔记01-运行时数据区域
  • 3.14学习总结
  • RISC-V汇编学习(五)—— 汇编实战、GCC内联汇编(基于芯来平台)
  • 【训练细节解读】文本智能混合分块(Mixtures of Text Chunking,MoC)引领RAG进入多粒度感知智能分块阶段
  • 【乐企板式文件】关于乐企板式文件使用OFD模板解析的方式实现说明
  • AAAI2025 Accepted Papers(二)
  • AWS Bedrock全托管接入国产大模型DeepSeek-R1[内涵免费使用DeepSeek-R1满血版]
  • 【0x80070666】-已安装另一个版本...(Tableau 安装失败)
  • MFC中使用Create或CreateDialog创建对话框失败,GetLastError错误码为1813(找不到映像文件中指定的资源类型)
  • linux 命令 case
  • 王毅同丹麦外交大臣拉斯穆森会谈
  • 复旦一校友捐赠1亿元,却不留名
  • 体坛联播|水晶宫队史首夺足总杯,CBA总决赛爆发赛后冲突
  • 卿晨璟靓等用服刑经历“引流”,专家:将犯罪问题娱乐化会消解刑罚严肃性
  • 全国林业院校校长论坛举行,聚焦林业教育的创新与突破
  • 昆明公布3起经济犯罪案例:一人持有820余万假美元被判刑十年