我在互聯網上讀到的關于整數和字串的內容是它們本質上是不可變的。但是下面的代碼顯示,在改變這些型別的值之后,它們仍然指向同一個地址。這與 python 中型別的本質背后的想法相矛盾。誰能給我解釋一下?提前致謝。
package main
import (
"fmt"
)
func main() {
num := 2
fmt.Println(&num)
num = 3
fmt.Println(&num) // address value of the num does not change
str := "2"
fmt.Println(&str)
str = "34"
fmt.Println(&str) // address value of the str does not change
}```
uj5u.com熱心網友回復:
數字本質上是不可變的。7是7,明天就不是8了。這并不意味著存盤在變數中的數字不能改變。變數是可變的。它們是可變或不可變值的可變容器。
Go 字串在語言設計上是不可變的;該string型別不支持任何變異運算子(例如在字串中間追加或替換字符)。但是,賦值可以改變變數包含的字串。
在 Python(至少是 CPython)中,數字被實作為一種物件,與任何其他物件一樣具有地址和欄位。當您使用 進行技巧時id(),您正在查看變數“后面”的物件的地址,該地址可能會或可能不會改變,具體取決于您對它所做的事情,以及它是否最初是一個實習小整數或類似的東西那。
在 Go 中,整數就是整數。它存盤為整數。變數的地址就是變數的地址。如果垃圾收集器決定移動變數的地址(使地址的數值或多或少無用),變數的地址可能會發生變化,但它不會向您揭示有關算術運算子實作的任何技巧,因為沒有沒有。
字串比整數更復雜;它們在內部有點像物件,是一個包含指標和大小的結構。但是獲取字串變數的地址&str并不能告訴您有關該內部結構的任何資訊,也不能告訴您 Go 編譯器是決定使用從頭字串值進行賦值,還是修改舊的地方(它可以在不違反任何規則的情況下,如果它可以證明舊的永遠不會再被其他任何東西看到)。它告訴你的只是地址str。如果你想知道那個內部指標是否改變了,你就必須使用反射......但幾乎沒有任何實際的理由這樣做。
uj5u.com熱心網友回復:
當你讀到一個字串是不可變的時,這意味著你不能通過索引來修改它,例如:
x := "hello"
x[2] = 'r'
//will raise an error
正如評論所說,當您修改整個 var(而不是帶有索引的一部分)時,它與是否可變無關,您可以這樣做
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/448503.html
標籤:走
