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

一文详解Go语言字符串

文章目录

  • Go语言字符串的本质
    • 内存结构
  • 和其他类型的转换(内存结构的变化)
    • 转[]rune
    • 转 []bytes
    • 测试代码
  • 和 C 语言 `[]char` 的区别

Go语言字符串的本质

Go 语言字符串本质是指向一串一段只读的 UTF-8 字节序列的描述符

两个关键

  • 只读
  • UTF-8 编码的字节序列

内存结构

在 Go 的源码中(具体可见 runtime/string.go)

type stringStruct struct {  str unsafe.Pointer  len int  
}
层面原因说明
UTF-8 编码变长结构,无法安全修改部分字节改动一个字节可能破坏整个字符
Go 语言设计字符串不可变保证安全、高效、可共享
修改方式转为 []rune[]byte才能进行内容更改

和其他类型的转换(内存结构的变化)

转[]rune

Unicode 规定“编号”,UTF 编码规定“存法”。
Unicode 像身份证号体系,UTF 像不同格式的数据库存储规则。

转换方向语法说明
string → []runerunes := []rune(str)将字符串解码成 Unicode 码点切片
[]rune → stringstr := string(runes)将 Unicode 码点重新编码成 UTF-8 字符串
string → []rune 实现的具体逻辑见 func stringtoslicerune(buf *[tmpStringBufSize]rune, s string) []rune
内容string[]rune备注
每个字符占用1~4 字节(UTF-8)4 字节(int32)rune 固定 4 字节
是否分配新内存✅ 是转换时分配新切片
可否修改✅ 可以string 只读
是否引用同一底层数据❌ 否❌ 否完全新分配
func stringtoslicerune(buf *[tmpStringBufSize]rune, s string) []rune {  // two passes.  // unlike slicerunetostring, no race because strings are immutable.    n := 0  for range s {  n++  }  var a []rune  if buf != nil && n <= len(buf) {  *buf = [tmpStringBufSize]rune{}  a = buf[:n]  } else {  a = rawruneslice(n)  }  n = 0  for _, r := range s {  a[n] = r  n++  }  return a  
}

转 []bytes

转换方向操作是否分配新内存是否复制安全性
string → []byte[]byte(s)✅ 是✅ 是✅ 安全
[]byte → stringstring(b)✅ 是✅ 是✅ 安全

测试代码

func string_impl() {s1 := "My name is 张朝阳"arr := []byte(s1)brr := []rune(s1)fmt.Printf("last byte %d\n", arr[len(arr)-1]) // string可以转换为[]byte或[]rune类型fmt.Printf("last byte %c\n", arr[len(arr)-1]) // %c以unicode字符进行输出fmt.Printf("last rune %d\n", brr[len(brr)-1])fmt.Printf("last rune %c\n", brr[len(brr)-1])L := len(s1)fmt.Printf("string len %d byte array len %d runearray len %d\n",L,len(arr),len(brr))for _,ele := range sl {fmt.Printf("%c",ele)//按rune进行遍历输出}fmt.Println()for i := 0;i<L;i++ {fmt.Printf("%c",s1[i])//[i]前面应该出现数组或切片,这里自动把string转成了[]byte(而不是[]rune)}fmt.Println()arr[0]=9// s1[0]=9·//字符串不能修改fmt.Println(utf8.RunecountInstring(s1),len([]rune(s1)))//查看string里有几个rune
}

和 C 语言 []char 的区别

[]char 本质是一个字节数组

特征C语言Go语言
内存管理手动自动
可变性可变不可变
结束符\0结尾存储长度
字符集ASCII/手动UTF-8默认UTF-8
标准库<string.h>stringsbytesunicode/utf8
安全性容易出错更安全
性能较高但需谨慎略低但稳定

http://www.dtcms.com/a/456656.html

相关文章:

  • 通用:MySQL-LBCC并发锁机制
  • Elasticsearch:使用推理端点及语义搜索演示
  • 基于websocket的多用户网页五子棋(九)
  • Async++ 源码分析13--parallel_reduce.h
  • 分布式api调用时间优化和问题排查
  • LeetCode每日一题,20251008
  • h5网站建设的具体内容电子商务平台网站模板
  • hive sql优化基础
  • Linux小课堂: Linux 系统的多面性与 CentOS 下载指南
  • 详解redis,MySQL,mongodb以及各自使用场景
  • 开发网站设计公司建设通网站会员共享密码
  • Linux相关工具vim/gcc/g++/gdb/cgdb的使用详解
  • Verilog和FPGA的自学笔记2——点亮LED
  • uniapp创建ts项目tsconfig.json报错的问题
  • Linux性能调优之内核网络栈发包收包认知
  • 静态网站挂马u钙网logo设计影视剪辑
  • Rust 基础语法指南
  • C11 安全字符串转整数函数详解:atoi_s、atol_s、strtol_s 与 strtoimax_s
  • 从入门到实战:全面解析Protobuf的安装配置、语法规范与高级应用——手把手教你用Protobuf实现高效数据序列化与跨语言通信
  • SaaS版MES系统PC端后台功能清单与设计说明
  • 广州建立公司网站多少钱php网站培训机构企业做网站
  • 若依前后端分离版学习笔记(十九)——导入,导出实现流程及图片,文件组件
  • SSM后台投票网站系统9h37l(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 基于springboot高校汉服租赁系统的设计与实现(文末附源码)
  • 【AI大模型】WPS 接入DeepSeek 实战项目详解
  • 12306网站为什么做那么差网站的统计代码是什么意思
  • 第二章 预备知识(线性代数)
  • 建设网站服务器的方式有自营方式山楂树建站公司
  • 10.8 树形dp
  • Java中第三方日志库-Log4J