簡(jiǎn)單聊聊為什么說(shuō)Go語(yǔ)言字符串是不可變的
最近有讀者留言說(shuō),平時(shí)在寫代碼的過程中,是會(huì)對(duì)字符串進(jìn)行修改的,但網(wǎng)上都說(shuō) Go 語(yǔ)言字符串是不可變的,這是為什么呢?
這個(gè)問題本身并不困難,但對(duì)于新手來(lái)說(shuō)確實(shí)容易產(chǎn)生困惑,今天就來(lái)回答一下。
首先來(lái)看看它的底層結(jié)構(gòu):
type?stringStruct?struct?{ ????str?unsafe.Pointer ????len?int }
和切片的結(jié)構(gòu)很像,只不過少了一個(gè)表示容量的 cap
字段。
str
:指向一個(gè)[]byte
類型的指針len
:字符串的長(zhǎng)度
所以,當(dāng)我們定義一個(gè)字符串:
s?:=?"Hello?World"
那么它在內(nèi)存中存儲(chǔ)是這樣的:
當(dāng)我們?cè)诔绦蛑袑?duì)字符串進(jìn)行重新賦值時(shí),比如這樣:
s?:=?"Hello?World" s?=?"Hello?AlwaysBeta"
底層的存儲(chǔ)就變成了這樣:
Go 實(shí)際上是重新創(chuàng)建了一個(gè) []byte{}
切片,然后讓指針指向了新的地址。
更直接一點(diǎn),我們直接修改字符串中的單個(gè)字符,比如:
s?:=?"Hello?World" s[0]?=?'h'
這樣做的話,會(huì)直接報(bào)錯(cuò):
cannot?assign?to?s[0]?(strings?are?immutable)
如果一定要這么做的話,需要對(duì)字符串進(jìn)行一個(gè)轉(zhuǎn)換,轉(zhuǎn)換成 []byte
類型,修改之后再轉(zhuǎn)換回 string
類型:
s?:=?"Hello?World" sBytes?:=?[]byte(s) sBytes[0]?=?'h' s?=?string(sBytes)
這樣就可以了。
到此這篇關(guān)于簡(jiǎn)單聊聊為什么說(shuō)Go語(yǔ)言字符串是不可變的的文章就介紹到這了,更多相關(guān)Go語(yǔ)言字符串內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入了解Golang中的Slice底層實(shí)現(xiàn)
本文主要為大家詳細(xì)介紹了Golang中slice的底層實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2023-02-02Golang之casbin權(quán)限管理的實(shí)現(xiàn)
這篇文章主要介紹了Golang之casbin權(quán)限管理的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10GO語(yǔ)言實(shí)現(xiàn)文件上傳的示例代碼
這篇文章主要分享一下golang實(shí)現(xiàn)文件上傳的流程和具體代碼,供大家參考,感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助2022-08-08詳解Go語(yǔ)言單元測(cè)試中如何解決MySQL存儲(chǔ)依賴問題
MySQL?存儲(chǔ)就是一個(gè)非常常見的外部依賴,這篇文章主要來(lái)和大家一起探討在?Go?語(yǔ)言中編寫單元測(cè)試時(shí),如何解決?MySQL?存儲(chǔ)依賴,需要的可以參考一下2023-07-07go語(yǔ)言異常panic和恢復(fù)recover用法實(shí)例
這篇文章主要介紹了go語(yǔ)言異常panic和恢復(fù)recover用法,實(shí)例分析了異常panic和恢復(fù)recover使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03GO中使用谷歌GEMINI模型任務(wù)代碼實(shí)例
這篇文章主要為大家介紹了GO中使用谷歌GEMINI模型任務(wù)代碼實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01