亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 整數和字符串是不可變的還是可變的?

Go 整數和字符串是不可變的還是可變的?

Go
慕標5832272 2022-11-23 19:54:20
我在互聯網上讀到的關于整數和字符串的內容是它們本質上是不可變的。但是下面的代碼表明,在改變這些類型的值之后,它們仍然指向同一個地址。這與 python 中類型的本質背后的想法相矛盾。誰能解釋一下這個?提前致謝。package mainimport (    "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}```
查看完整描述

2 回答

?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

數字本質上是不可變的。7是7,明天不是8。并不意味著存儲在變量中的數字不能改變。變量是變量。它們是可變或不可變值的可變容器。

根據語言設計,Go 字符串是不可變的;該string類型不支持任何可變運算符(例如在字符串中間附加或替換字符)。但是,同樣,賦值可以改變變量包含的字符串。

在 Python(至少是 CPython)中,數字被實現為一種對象,與任何其他對象一樣具有地址和字段。當你用 做技巧時id(),你正在查看變量“后面”的對象的地址,它可能會改變也可能不會改變,這取決于你對它做了什么,以及它最初是否是一個 interned 小整數或類似的東西那。

在 Go 中,整數就是整數。它存儲為一個整數。變量的地址就是變量的地址。如果垃圾收集器決定移動它,變量的地址可能會改變(使地址的數值或多或少無用),但它不會向您揭示任何關于算術運算符實現的技巧,因為沒有'沒有。

字符串比整數更復雜;它們內部有點像對象,是一個包含指針和大小的結構。但是獲取字符串變量的地址&str并不能告訴你關于該內部結構的任何信息,也不能告訴你 Go 編譯器是否決定使用新的字符串值進行賦值,或者修改舊的地方(它可以,在不違反任何規則的情況下,如果它能證明舊的再也不會被其他任何東西看到)。它告訴你的只是 的地址str。如果您想查明該內部指針是否已更改,則必須使用反射……但幾乎沒有任何實際理由這樣做。


查看完整回答
反對 回復 2022-11-23
?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

當你讀到一個字符串是不可變的時,這意味著你不能通過索引修改它,例如:


x := "hello"

x[2] = 'r'

//will raise an error

正如評論所說,當您修改整個 var(而不是使用索引的一部分)時,它與是否可變無關,您可以這樣做


查看完整回答
反對 回復 2022-11-23
  • 2 回答
  • 0 關注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號