首頁 > 後端開發 > Golang > 為什麼在 Go 中更改字串指標似乎會修改不可變字串?

為什麼在 Go 中更改字串指標似乎會修改不可變字串?

DDD
發布: 2024-12-15 00:23:15
原創
237 人瀏覽過

Why Does Changing a String Pointer Seem to Modify an Immutable String in Go?

不可變字串值

Go 規範規定字串是不可變的,這表示一旦創建,其內容就無法更改。這與以下程式碼片段形成了明顯的矛盾:

str := "hello"
fmt.Printf("%p\n",&str) // 0x1040c128
fmt.Printf("%v\n",str) // hello
ptr := &str
*ptr = "world"
fmt.Printf("%p\n",&str) // 0x1040c128
fmt.Printf("%v\n",str) // world  
登入後複製

如果字串是不可變的,為什麼更改分配給 str 的指標的值也會更改 str 的值?

解釋

這裡的關鍵差異在於字串值和字串變數之間。 str 是字串類型的變數。當您在 str 上使用賦值運算子 (=) 時,您正在變更 str 變數的值,而不是 str 所引用的字串的值。

在 Go 中,字串值由reflect. StringHeader 結構體,其中包含指向資料及其長度的指標。一旦創建,該結構就無法修改。

& 運算子傳回變數的位址,而不是變數的值。因此, &str 傳回 str 變數的位址,而不是 str 引用的字串值的位址。

當您使用 ptr := &str 語句時,您正在建立一個指向 str 變數的指標。給 *ptr 賦值會改變 str 變數的值,但不會改變 str 所引用的字串的值。

結論

在 Go 中,字串值是不可變的。然而,字串變數是可以修改的,這可以間接改變變數所引用的字串值。

以上是為什麼在 Go 中更改字串指標似乎會修改不可變字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板