2 回答

TA貢獻1842條經驗 獲得超13個贊
數字本質上是不可變的。7是7,明天不是8。這并不意味著存儲在變量中的數字不能改變。變量是變量。它們是可變或不可變值的可變容器。
根據語言設計,Go 字符串是不可變的;該string
類型不支持任何可變運算符(例如在字符串中間附加或替換字符)。但是,同樣,賦值可以改變變量包含的字符串。
在 Python(至少是 CPython)中,數字被實現為一種對象,與任何其他對象一樣具有地址和字段。當你用 做技巧時id()
,你正在查看變量“后面”的對象的地址,它可能會改變也可能不會改變,這取決于你對它做了什么,以及它最初是否是一個 interned 小整數或類似的東西那。
在 Go 中,整數就是整數。它存儲為一個整數。變量的地址就是變量的地址。如果垃圾收集器決定移動它,變量的地址可能會改變(使地址的數值或多或少無用),但它不會向您揭示任何關于算術運算符實現的技巧,因為沒有'沒有。
字符串比整數更復雜;它們在內部有點像對象,是一個包含指針和大小的結構。但是獲取字符串變量的地址&str
并不能告訴你關于該內部結構的任何信息,也不能告訴你 Go 編譯器是否決定使用新的字符串值進行賦值,或者修改舊的地方(它可以,在不違反任何規則的情況下,如果它能證明舊的再也不會被其他任何東西看到)。它告訴你的只是 的地址str
。如果您想查明該內部指針是否已更改,則必須使用反射……但幾乎沒有任何實際理由這樣做。

TA貢獻1712條經驗 獲得超3個贊
當你讀到一個字符串是不可變的時,這意味著你不能通過索引修改它,例如:
x := "hello"
x[2] = 'r'
//will raise an error
正如評論所說,當您修改整個 var(而不是使用索引的一部分)時,它與是否可變無關,您可以這樣做
- 2 回答
- 0 關注
- 140 瀏覽
添加回答
舉報