2 回答

TA貢獻1844條經驗 獲得超8個贊
“我的理由是 m["xxx"] 返回值的副本” ——我認為這不是一個公平的假設。索引表達式下的規范僅說明以下內容:
表單的主要表達式表示[...] 映射的
a[x]
元素a
x
和
如果地圖包含一個帶有 key 的條目
x
,a[x]
是帶有 key 的地圖元素x
動詞“表示”和“是”可以說并不意味著副本。僅當您將索引表達式的結果分配給變量時才會進行復制。
地圖索引表達式根本不可尋址,因此您無法記憶地圖中存儲的值的別名。
至于增量運算符是否++
是語法糖+= 1
,規范明確指出:
以下賦值語句在語義上是等價的:
IncDec 語句分配 x++ x += 1 x-- x -= 1
Soop++
與 具有相同的含義op += 1
,并且使用 keya[x]++
遞增a[x]
“表示/是”映射元素的操作數x
。

TA貢獻1900條經驗 獲得超5個贊
語言規范說 ++/-- 運算符應該使用映射索引表達式作為操作數。
https://go.dev/ref/spec#IncDec_statements
“++”和“--”語句通過無類型常量 1 遞增或遞減它們的操作數。與賦值一樣,操作數必須是可尋址的或映射索引表達式。
未指定應如何實現該功能,因此在不同編譯器或同一編譯器的不同版本之間可能會有所不同。
如果你搜索cmd/compile/internal
你的 Go 安裝目錄,如果我沒記錯的話,這是 Go 編譯器的源代碼,你會發現很多行似乎證實了你的猜測。但是,我對代碼的了解還遠遠不夠,無法提供結論性的答案。
我從未看過的規范的gccgo
實現可能會也可能不會以同樣的方式執行 IncDec。
- 2 回答
- 0 關注
- 191 瀏覽
添加回答
舉報