日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

最近有讀者留言說,平時在寫代碼的過程中,是會對字符串進行修改的,但網上都說 Go 語言字符串是不可變的,這是為什么呢?

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

首先來看看它的底層結構:

type stringStruct struct {
    str unsafe.Pointer
    len int
}

和切片的結構很像,只不過少了一個表示容量的 cap 字段。

  • str:指向一個 []byte 類型的指針
  • len:字符串的長度

所以,當我們定義一個字符串:

s := "Hello World"

那么它在內存中存儲是這樣的:

 

圖片

 

當我們在程序中對字符串進行重新賦值時,比如這樣:

s := "Hello World"

s = "Hello AlwaysBeta"

底層的存儲就變成了這樣:

 

圖片

 

Go 實際上是重新創建了一個 []byte{} 切片,然后讓指針指向了新的地址。

更直接一點,我們直接修改字符串中的單個字符,比如:

s := "Hello World"
s[0] = 'h'

這樣做的話,會直接報錯:

cannot assign to s[0] (strings are immutable)

如果一定要這么做的話,需要對字符串進行一個轉換,轉換成 []byte 類型,修改之后再轉換回 string 類型:

s := "Hello World"
sBytes := []byte(s)
sBytes[0] = 'h'
s = string(sBytes)

這樣就可以了。

分享到:
標簽:語言
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定