新聞中心
這個問題本身并不困難,但對于新手來說確實容易產(chǎn)生困惑,今天就來回答一下。

成都創(chuàng)新互聯(lián)長期為1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為巴宜企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計,巴宜網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
首先來看看它的底層結(jié)構(gòu):
type stringStruct struct {
str unsafe.Pointer
len int
}和切片的結(jié)構(gòu)很像,只不過少了一個表示容量的 cap 字段。
- str:指向一個 []byte 類型的指針
- len:字符串的長度
所以,當(dāng)我們定義一個字符串:
s := "Hello World"那么它在內(nèi)存中存儲是這樣的:
當(dāng)我們在程序中對字符串進(jìn)行重新賦值時,比如這樣:
s := "Hello World"
s = "Hello AlwaysBeta"底層的存儲就變成了這樣:
Go 實際上是重新創(chuàng)建了一個 []byte{} 切片,然后讓指針指向了新的地址。
更直接一點(diǎn),我們直接修改字符串中的單個字符,比如:
s := "Hello World"
s[0] = 'h'這樣做的話,會直接報錯:
cannot assign to s[0] (strings are immutable)如果一定要這么做的話,需要對字符串進(jìn)行一個轉(zhuǎn)換,轉(zhuǎn)換成 []byte 類型,修改之后再轉(zhuǎn)換回 string 類型:
s := "Hello World"
sBytes := []byte(s)
sBytes[0] = 'h'
s = string(sBytes)這樣就可以了。
分享文章:為什么說Go語言字符串是不可變的?
網(wǎng)頁網(wǎng)址:http://m.fisionsoft.com.cn/article/dhoeohs.html


咨詢
建站咨詢
