2 回答

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

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