簡單聊聊為什么說Go語言字符串是不可變的
最近有讀者留言說,平時(shí)在寫代碼的過程中,是會對字符串進(jìn)行修改的,但網(wǎng)上都說 Go 語言字符串是不可變的,這是為什么呢?
這個(gè)問題本身并不困難,但對于新手來說確實(shí)容易產(chǎn)生困惑,今天就來回答一下。
首先來看看它的底層結(jié)構(gòu):
type?stringStruct?struct?{ ????str?unsafe.Pointer ????len?int }
和切片的結(jié)構(gòu)很像,只不過少了一個(gè)表示容量的 cap
字段。
str
:指向一個(gè)[]byte
類型的指針len
:字符串的長度
所以,當(dāng)我們定義一個(gè)字符串:
s?:=?"Hello?World"
那么它在內(nèi)存中存儲是這樣的:
當(dāng)我們在程序中對字符串進(jìn)行重新賦值時(shí),比如這樣:
s?:=?"Hello?World" s?=?"Hello?AlwaysBeta"
底層的存儲就變成了這樣:
Go 實(shí)際上是重新創(chuàng)建了一個(gè) []byte{}
切片,然后讓指針指向了新的地址。
更直接一點(diǎn),我們直接修改字符串中的單個(gè)字符,比如:
s?:=?"Hello?World" s[0]?=?'h'
這樣做的話,會直接報(bào)錯(cuò):
cannot?assign?to?s[0]?(strings?are?immutable)
如果一定要這么做的話,需要對字符串進(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)于簡單聊聊為什么說Go語言字符串是不可變的的文章就介紹到這了,更多相關(guān)Go語言字符串內(nèi)容請搜索腳本之家以前的文章或繼續(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ì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10go語言異常panic和恢復(fù)recover用法實(shí)例
這篇文章主要介紹了go語言異常panic和恢復(fù)recover用法,實(shí)例分析了異常panic和恢復(fù)recover使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03GO中使用谷歌GEMINI模型任務(wù)代碼實(shí)例
這篇文章主要為大家介紹了GO中使用谷歌GEMINI模型任務(wù)代碼實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01