Go string 字符串底层逻辑

在 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.mzph.cn/news/898109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【NLP】10. 机器学习模型性能评估指标(含多类别情况), ROC,PRC

机器学习模型性能评估指标(含多类别情况) 1. 模型评估指标简介 在机器学习中,模型的性能评估非常重要。常用的模型评估指标有: 准确率(Accuracy)精度(Precision)召回率&#xff0…

开源通义万相本地部署方案,文生视频、图生视频、视频生成大模型,支持消费级显卡!

开源通义万相本地部署方案,文生视频、图生视频、视频生成大模型,支持消费级显卡! 万相2.1开源 近日,大模型万相2.1(Wan)重磅开源,此次开源采用Apache2.0协议,14B和1.3B两个参数规格…

机器学习与深度学习中模型训练时常用的四种正则化技术L1,L2,L21,ElasticNet

L1正则化和L2正则化是机器学习中常用的两种正则化方法,用于防止模型过拟合。它们的区别主要体现在数学形式、作用机制和应用效果上。以下是详细对比: 1. 数学定义 L1正则化(也叫Lasso正则化): 在损失函数中加入权重参…

qt+opengl 播放yuv视频

一、实现效果 二、pro文件 Qt widgets opengl 三、主要代码 #include "glwidget.h"GLWidget::GLWidget(QWidget *parent) : QOpenGLWidget(parent) {connect(&m_timer, &QTimer::timeout, this,[&](){this->update();});m_timer.start(1000/33); }v…

Android开源库——RxJava和RxAndroid

RxJava和RxAndroid是什么? RxJava是基于JVM的响应式扩展,用于编写异步代码 RxAndroid是关于Android的RxJava绑定 RxJava和RxAndroid使用 依赖 implementation io.reactivex.rxjava3:rxjava:3.1.0 implementation io.reactivex.rxjava3:rxandroid:3.…

并发基础—三大问题:可见性、原子性、有序性

文章目录 可见性原子性有序性(指令重排)经典的指令重排案例:单例模式的双重检查锁volatile和synchronize都可以保证有序性并发压测工具Jcstress证明指令重排会在多线程下出现问题(了解)CPU缓存分为三个级别&#xff1a…

PyTorch 入门学习

目录 PyTorch 定义 核心作用 应用场景 Pytorch 基本语法 1. 张量的创建 2. 张量的类型转换 3. 张量数值计算 4. 张量运算函数 5. 张量索引操作 6. 张量形状操作 7. 张量拼接操作 8. 自动微分模块 9. 案例-线性回归案例 PyTorch 定义 PyTorch 是一个基于 Python 深…

Hive SQL 精进系列:REGEXP_REPLACE 函数的用法

目录 一、引言二、REGEXP_REPLACE 函数基础2.1 基本语法参数详解2.2 简单示例 三、REGEXP_REPLACE 函数的应用场景3.1 去除特殊字符3.2 统一字符串格式 四、REGEXP_REPLACE 与 REPLACE 函数的对比4.1 功能差异4.2 适用场景 五、REGEXP_REPLACE 与 REGEXP 函数的对比5.1 功能差异…

从0开始搭建微服务架构特别篇SpringCloud网关聚合knife4j

前言:总所周知项目开发接口测试需要knife4j,但是,微服务架构中微服务很多,模块地址很多,需要统一管理api测试,就需要聚合在网关统一调用,本章,就说明如何通过网关聚合使用knife4j。 …

Spring Cloud 中的服务注册与发现: Eureka详解

1. 背景 1.1 问题描述 我们如果通过 RestTamplate 进行远程调用时,URL 是写死的,例如: String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 当机器更换或者新增机器时,这个 URL 就需要相应地变…

网页制作15-Javascipt时间特效の记录网页停留时间

01效果图: 02运用: window.setTimeout()刷新function()函数document.forms():表单if条件语句window.alert()窗口警示 03、操作代码:…

【Rust基础】排序和分组

排序 简单排序 整数排序 #[test] fn test_sort(){let mut list vec![1, 5, 3, 2, 4];list.sort(); //✔assert_eq!(list, vec![1, 2, 3, 4, 5]); }小数排序 #[test] fn test_sort(){let mut list vec![1, 5, 3, 2, 4];//❌ 不能直接使用sort,因为f32和f64未实现O…

C++ std::list超详细指南:基础实践(手搓list)

目录 一.核心特性 1.双向循环链表结构 2.头文件:#include 3.时间复杂度 4.内存特性 二.构造函数 三.list iterator的使用 1.学习list iterator之前我们要知道iterator的区分 ​编辑 2.begin()end() 3.rbegin()rend() 四.list关键接口 1.empty() 2. size…

996引擎 - 红点系统

996引擎 - 红点系统 总结NPC 红点(TXT红点)Lua 红点1. Red_Point.lua2. UI_Ex.lua参考资料以下内容是在三端 lua 环境下测试的 总结 红点系统分几个部分组成。 M2中设置变量推送。 配置红点表。 Envir\Data\cfg_redpoint.xls 2.1. UI元素中找到ID填写 ids 列。 主界面挂载…

C语言——变量与常量

C语言中的变量与常量:简洁易懂的指南 在C语言编程中,变量和常量是最基本的概念之一。理解它们的区别和使用方法对于编写高效、可维护的代码至关重要。本文将详细介绍C语言中的变量和常量,并通过图表和代码示例帮助你更好地理解。 目录 什么…

PySide(PyQt),使用types.MethodType动态定义事件

以PySide(PyQt)的图片项为例,比如一个视窗的场景底图是一个QGraphicsPixmapItem,需要修改它的鼠标滚轮事件,以实现鼠标滚轮缩放显示的功能。为了达到这个目的,可以重新定义一个QGraphicsPixmapItem类,并重写它的wheelE…

K8S学习之基础三十一:k8s中RBAC 的核心概念

Kubernetes (k8s) 中的 RBAC(Role-Based Access Control,基于角色的访问控制)是一种用于管理用户和服务账户对集群资源访问权限的机制。RBAC 允许管理员通过定义角色(Role)和角色绑定(RoleBinding&#xff…

【eNSP实战】三层交换机使用ACL实现网络安全

拓图 要求: vlan1可以访问Internetvlan2和vlan3不能访问Internet和vlan1vlan2和vlan3之间可以互相访问PC配置如图所示,这里不展示 LSW1接口vlan配置 vlan batch 10 20 30 # interface Vlanif1ip address 192.168.40.2 255.255.255.0 # interface Vla…

软考系统架构师 — 1 考点分析

目录 1 考点总结 1 考点总结 章节 内容 真题考察 绪论 1. 绪论 不考 计算机相关知识 2. 计算机系统基础知识,新增计算机硬件、嵌入式、计算机语言、系统工程 对应计算机组成结构、操作系统、数据库、计算机网络、多媒体等知识点,整体分值在 10 …

在Eclipse 中使用 MyBatis 进行开发,通常需要以下步骤:

在Eclipse 中使用 MyBatis 进行开发,通常需要以下步骤: 1. 创建 Maven 项目 首先,在 Eclipse 中创建一个 Maven 项目。如果你还没有安装 Maven 插件,可以通过 Eclipse Marketplace 安装 Maven 插件。 打开 Eclipse,选…