数据:字符串内部实现

本文探讨了Go语言中字符串的内部实现,与C语言中char*的区别,强调了Go字符串的不可变性。Go字符串由指针和长度组成,其动态构建的字符串分配在堆上。不可变性带来了池化共享、安全性和性能优化,如通过hashcode快速比较字符串。文章还讨论了不可取元素地址的原因,以及CPU密集型和IO密集型代码的分离策略。
摘要由CSDN通过智能技术生成

字符串内部实现

看 runtime 源码找字符串的定义:

grep -n "type string" *
type stringStruct struct {
    str unsafe.Pointer
    len int
}

uintptrunsafe.Pointer区别,uintptr保存的是整数,并不能保证目标不会被垃圾回收,不能保证它持有对象的引用。

uintint区别,跟汇编指令优化有关系,int类型是汇编处理默认类型,汇编对于数字是有类型的,在内核层面以性能为优先,并不在乎业务实现。暴露给用户的是公开接口,内部性能优先。不同类型CPU架构处理方式不一样,所以会选择默认类型。

13 Go字符串和C char*的差异

C语言中*char代表字符串,一个字节数组加个一个结束符。Go语言字符串底层是字节数组,字节数组保存数据但没有结束信息。它单独会构建一个头信息,头信息开始位置是个指针

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值