程序员面试合集第一篇_百事通
2022-11-17 16:38:59 来源:程序员客栈
为什么说Go中的字符串不能修改 在接触Go这门语言,可能你经常会听到这样一句话。对于字符串不能修改,可能你很纳闷,日常开发中我们对字符串进行修改也是很正常的,为什么又说Go中的字符串不能进行修改呢?本问题就来通过实际案例给大家演示,为什么Go中的字符串不能进行修改。在演示这个问题之前,我们先对字符串类型的基础知识做个大致的演示,这样便于大家对问题的进一步了解。字符串定义字符串是一种用来表示字符的数据类型。在使用时,使用" "将字符内容包含起来。例如下面的形式:
packagemainimport"fmt"funcmain(){varstrstring="HelloWorld!"}
在Go中,字符串通常有三种定义方式:
//第一种(全量定义)var变量名称string="字符串内容"//类型推导var变量名称="字符串内容"//短标记(只适用于局部变量)变量名称:="字符串内容"
(资料图)
字符串的组成 Go中的字符串符合Unicode标准,并且采用UTF-8编码。字符串底层其实也是由byte组成(后面会仔细讲解)。通过下面的示例,打印查看具体的字节内容:字符串的定义,其实也可以通过字节的方式。这里罗列的方式是最为常见的方式。
s:="HelloWorld!"for_,v:=ranges{fmt.Print(v)fmt.Print("\t")}//72101108108111328711111410810033
字符串不能修改通过上面的大致演示,我们对字符串有一个基本的了解。对于字符串不能修改,可能你很纳闷,日常开发中我们对字符串进行重新赋值也是很正常的,为什么又说Go中的字符串不能进行修改呢?其实这里要纠正这个说法,对于字符串修改并不等价于重新赋值。开发中常用的方式,其实是一种重新赋值的概念。上面代码打印的内容,就是每一个字符所表示的字节码。
str:="HelloWorld!"//重新赋值str="HelloGo!"//字符串修改str[0]="I"
回归正题,为什么Go中的字符串不能通过下标的方式来进行修改呢?这是因为Go中的字符串的数据结构体是由一个指针和长度组成的结构体,该指针指向的一个切片才是真正的字符串值。Go中源码有这样一段定义:通常听到的不能修改,其实就是指的上面代码的第二种方式。并且通过这种方式修改会报错::cannot assign to s[0] (value of type byte)
typestringStructstruct{strunsafe.Pointer//指向一个byte类型的切片指针lenint//字符串的长度}正是因为底层是一个[]byte类型的切片,当我们使用下标的方式去修改值,这时候将一个字符内容赋值给byte类型,肯定是不允许的。但是我们可以通过下标的方式去访问对应的byte值。
fmt.Println(s[0])//output:72那我们要想通过下标的方式去修改值该怎么办呢?这时候,就需要通过切片的方式来定义,然后在转成字符串。
packagemainimport("fmt")funcmain(){s1:=[]byte{72,101,108,108,111,32,87,111,114,108,100,33}fmt.Println(string(s1))//将"H"修改为ls1[0]=108fmt.Println(string(s1))}//output:HelloWorld!lelloWorld!字符串的赋值上面分析了为什么字符串不能使用下标去赋值,回过来解答一下日常开发中的赋值方式。
packagemainimport("fmt")funcmain(){//声明一个字符串,并给与初始值s:="HelloWorld!"//对变量s进行重新赋值s:="HelloGo!"}那为什么这种场景下又可以给字符串重新赋值呢?这是因为,在Go的底层其实是新创建了一个[]byte{}类型的切片,将变量s中的指针指向了新的内存空间地址(也就是这里的Hello Go!)。原有的Hello World!内存空间会随着垃圾回收机制被回收掉。为什么这么设计
相关阅读
-
世界热推荐:今晚7:00直播丨下一个突破...
今晚19:00,Cocos视频号直播马上点击【预约】啦↓↓↓在运营了三年... -
NFT周刊|Magic Eden宣布支持Polygon网...
Block-986在NFT这样的市场,每周都会有相当多项目起起伏伏。在过去... -
环球今亮点!头条观察 | DeFi的兴衰与...
在比特币得到机构关注之后,许多财务专家预测世界将因为加密货币的... -
重新审视合作,体育Crypto的可靠关系才能双赢
Block-987即使在体育Crypto领域,人们的目光仍然集中在FTX上。随着... -
简讯:前端单元测试,更进一步
前端测试@2022如果从2014年Jest的第一个版本发布开始计算,前端开发... -
焦点热讯:刘强东这波操作秀
近日,刘强东发布京东全员信,信中提到:自2023年1月1日起,逐步为...