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中文網其他相關文章!