在接触Go这么语言,可能你经常会听到这样一句话。对于字符串不能修改,可能你很纳闷,日常开发中我们对字符串进行修改也是很正常的,为什么又说Go中的字符串不能进行修改呢?,本文就来通过实际案例给大家演示,为什么Go中的字符串不能进行修改。,在演示这个问题之前,我们先对字符串类型的基础知识做个大致的演示,这样便于大家对问题的进一步了解。,字符串是一种用来表示字符的数据类型。在使用时,使用” “将字符内容包含起来。例如下面的形式:,在Go中,字符串通常有三种定义方式:,Go中的字符串符合Unicode[1]标准,并且采用UTF-8[2]编码。字符串底层其实也是由byte组成(后面会仔细讲解)。通过下面的示例,打印查看具体的字节内容:,通过上面的大致演示,我们对字符串有一个基本的了解。对于字符串不能修改,可能你很纳闷,日常开发中我们对字符串进行重新赋值也是很正常的,为什么又说Go中的字符串不能进行修改呢?,其实这里要纠正这个说话,对于字符串修改并不等价于重新赋值。开发中常用的方式,其实是一种重新赋值的概念。,回归正题,为什么Go中的字符串不能通过下标的方式来进行修改呢? 这是因为Go中的字符串的数据结构体是由一个指针和长度组成的结构体,该指针指向的一个切片才是真正的字符串值。Go中源码有这样一段定义:,,正是因为底层是一个[]byte类型的切片,当我们使用下标的方式去修改值,这时候将一个字符内容赋值给byte类型,肯定是不允许的。但是我们可以通过下标的方式去访问对应的byte值。,那我们要想通过下标的方式去修改值该怎么办呢?这时候,就需要通过切片的方式来定义,然后在转成字符串。,上面分析了为什么字符串不能使用下标去赋值,回过来解答一下日常开发中的赋值方式。,那为什么这种场景下又可以给字符串重新赋值呢? 这是因为,在Go的底层其实是新创建了一个[]byte{}类型的切片,将变量s中的指针指向了新的内存空间地址(也就是这里的Hello Go!)。原有的Hello World!内存空间会随着垃圾回收机制被回收掉。,,可能大家都会考虑到,为什么一个普通的字符串要设计这么复杂,还需要使用指针。暂时没找到官方文档的说明,,[1] Unicode: https://naveenr.net/unicode-character-set-and-utf-8-utf-16-utf-32-encoding/,[2] UTF-8: https://naveenr.net/unicode-character-set-and-utf-8-utf-16-utf-32-encoding/
文章版权声明
1 原创文章作者:cmcc,如若转载,请注明出处: https://www.52hwl.com/16602.html
2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈
3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)
4 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别