簡(jiǎn)單聊聊為什么說Go語言字符串是不可變的
最近有讀者留言說,平時(shí)在寫代碼的過程中,是會(huì)對(duì)字符串進(jìn)行修改的,但網(wǎng)上都說 Go 語言字符串是不可變的,這是為什么呢?
這個(gè)問題本身并不困難,但對(duì)于新手來說確實(shí)容易產(chǎn)生困惑,今天就來回答一下。
首先來看看它的底層結(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)單聊聊為什么說Go語言字符串是不可變的的文章就介紹到這了,更多相關(guān)Go語言字符串內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入了解Golang中的Slice底層實(shí)現(xiàn)
本文主要為大家詳細(xì)介紹了Golang中slice的底層實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2023-02-02
Golang之casbin權(quán)限管理的實(shí)現(xiàn)
這篇文章主要介紹了Golang之casbin權(quán)限管理的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
詳解Go語言單元測(cè)試中如何解決MySQL存儲(chǔ)依賴問題
MySQL?存儲(chǔ)就是一個(gè)非常常見的外部依賴,這篇文章主要來和大家一起探討在?Go?語言中編寫單元測(cè)試時(shí),如何解決?MySQL?存儲(chǔ)依賴,需要的可以參考一下2023-07-07
go語言異常panic和恢復(fù)recover用法實(shí)例
這篇文章主要介紹了go語言異常panic和恢復(fù)recover用法,實(shí)例分析了異常panic和恢復(fù)recover使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
GO中使用谷歌GEMINI模型任務(wù)代碼實(shí)例
這篇文章主要為大家介紹了GO中使用谷歌GEMINI模型任務(wù)代碼實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01

