據我了解,索引地圖會回傳地圖值的副本。考慮到這一點,請考慮以下代碼:
package main
import "fmt"
func main() {
m := map[string]int{"xxx": 100}
m["xxx"]
fmt.Println(m["xxx"]) // prints 101
}
上面的代碼列印101,而我的預期100。我的推理是m["xxx"]回傳分配給鍵的值的副本"xxx"(即,100),并且操作員 遞增該值的副本,但這不會影響存盤在映射中的原始值——只有副本發生了變化。
但是,考慮到我們通過將鍵放在括號內并使用=來指定值(即m[key] = value)來為映射鍵分配值。然后,如果m["xxx"] 被m["xxx"] = 1編譯器翻譯成 - 這反過來,相當于m["xxx"] = m["xxx"] 1- 這將解釋上面代碼的結果。
我的問題是增量運算子 ( ) 是否是加法賦值 ( ) 的語法糖 = 1。否則,我錯過了什么?
uj5u.com熱心網友回復:
“我的理由是 m["xxx"] 回傳值的副本” ——我認為這不是一個公平的假設。索引運算式下的規范僅說明以下內容:
表單的主要運算式表示[...] 映射的
a[x]元素ax
和
如果地圖包含一個帶有 key 的條目
x,a[x]是帶有 key 的地圖元素x
動詞“表示”和“是”可以說并不意味著副本。僅當您將索引運算式的結果分配給變數時才會進行復制。
地圖索引運算式根本不可尋址,因此您無法記憶地圖中存盤的值的別名。
至于增量運算子是否 是語法糖 = 1,規范明確指出:
以下賦值陳述句在語意上是等價的:
IncDec 陳述句分配 x x = 1 x-- x -= 1
Soop 與 具有相同的含義op = 1,并且使用 keya[x] 遞增a[x]“表示/是”映射元素的運算元x。
uj5u.com熱心網友回復:
語言規范說 /-- 運算子應該使用映射索引運算式作為運算元。
https://go.dev/ref/spec#IncDec_statements
“ ”和“--”陳述句通過無型別常量 1 遞增或遞減它們的運算元。與賦值一樣,運算元必須是可尋址的或映射索引運算式。
未指定應如何實作該功能,因此在不同編譯器或同一編譯器的不同版本之間可能會有所不同。
如果你搜索cmd/compile/internal你的 Go 安裝目錄,如果我沒記錯的話,這是 Go 編譯器的源代碼,你會發現很多行似乎證實了你的猜測。但是,我對代碼的了解還遠遠不夠,無法提供結論性的答案。
示例:一和二
我從未看過的規范的gccgo實作可能會也可能不會以同樣的方式執行 IncDec。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/429838.html
標籤:走
上一篇:在goland反序列化php
下一篇:在Go的后臺繼續運行第二個函式
