Go string 字符串底层逻辑

server/2025/3/15 10:06:14/
在 Go 语言中,string 类型的底层结构是一个结构体,包含两个字段:一个指向字节数组的指针和该字节数组的长度。以下是其在 Go 源码中的大致定义:
type stringStruct struct {str unsafe.Pointerlen 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 mainimport ("fmt""unsafe"
)func main() {s := "hello"// 打印字符串的长度fmt.Printf("Length of s: %d\n", len(s)) // Length of s: 5// 打印字符串的底层结构strStruct := (*struct {str unsafe.Pointerlen int})(unsafe.Pointer(&s))fmt.Printf("Pointer to underlying data: %p\n", strStruct.str) // Pointer to underlying data:  0xa60caffmt.Printf("Length of underlying data: %d\n", strStruct.len)  // Length of underlying data: 5fmt.Printf(" %v,%v\n", &s, strStruct)                         // 0xc000026070,&{0xa60caf 5}// 尝试修改字符串s = s + " world"// 打印新字符串的底层结构newStrStruct := (*struct {str unsafe.Pointerlen int})(unsafe.Pointer(&s))fmt.Printf("Pointer to new underlying data: %p\n", newStrStruct.str) // Pointer to new underlying data: 0xc00000a0e0fmt.Printf("Length of new underlying data: %d\n", newStrStruct.len)  // Length of new underlying data: 11fmt.Printf(" %v,%v\n", &s, newStrStruct)                             //  0xc000026070,&{0xc00000a0e0 11}
}


http://www.ppmy.cn/server/175121.html

相关文章

【Rust基础】Rust后端开发常用库

使用Rust有一段时间了,期间尝试过使用Rust做后端开发、命令行工具开发,以及做端侧模型部署,也尝试过交叉编译、FFI调用等,也算是基本入门了。在用Rust做后端接口开发时,常常会找不到一些合适库,而这些库在J…

前端构建工具进化论:从Grunt到Turbopack的十年征程

前端构建工具进化论:从Grunt到Turbopack的十年征程 一、石器时代:任务自动化工具(2012-2014) 1.1 Grunt:首个主流构建工具 // Gruntfile.js 典型配置 module.exports function(grunt) {grunt.initConfig({concat: {…

内网渗透之内网基础知识(一)

工作组 工作组:工作组是局域网中的一个概念,他是长久的资源管理模式。默认情况下使 用工作组方式进行资源管理,将不同的 computer 按照不同的要求分类到不同的组 域:用来描述一种架构,和“工作组”相对应,由工作组升级而来的高级…

【0x80070666】-已安装另一个版本...(Tableau 安装失败)

第一种是之前安装过tableau相关软件,但是没卸载干净。 方法1:卸载旧版本 打开 控制面板 → 程序和功能(或 添加/删除程序)。查找 Tableau Desktop,如果已安装旧版本,卸载它。重新启动电脑后再尝试安装。 …

【SpringMVC】常用注解:@RequestBody

1.作用 用于获取请求实体内容,直接使用得到的是keyvalue&keyvalue的数据。获取请求实体内容不适用get请求。 2.属性 required 描述是否有请求体,默认值为true。当取值为true时,get 请求方式会报错。如果取值为false,get请…

树莓派上的 TensorFlow Lite:从零开始的摄像头图像识别

**** 1. 引言 随着人工智能(AI)和机器学习(ML)的发展,越来越多的开发者希望在嵌入式设备(如树莓派)上运行 AI 模型,实现目标检测、人脸识别等功能。TensorFlow Lite(TF…

基于Hadoop的城市道路交通数据的可视化分析-Flask

开发语言:Python框架:flaskPython版本:python3.8数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 数据信息管理 数据信息修改 搜索功能 公告展示界面 公告修改…

【生活好帮手】saas小程序,让线上服务触手可及。

在日常生活中,我们经常会遇到各种需要线上服务的场景。比如,想在周末宅家点一杯咖啡,或者预约一次健身课程,又或者为自己的小店搭建一个线上销售渠道。这时候,一个好用的小程序就成了我们的生活加速器。今天&#xff0…