3 回答

TA貢獻1801條經驗 獲得超8個贊
Spec:對于具有范圍子句的語句,表示行為是不可預測的:
未指定映射的迭代順序,也不保證從一次迭代到下一次迭代相同。如果在迭代期間移除尚未到達的映射條目,則不會生成相應的迭代值。如果在迭代期間創建了映射條目,則該條目可能會在迭代期間生成,也可以跳過。對于創建的每個條目以及從一次迭代到下一次迭代,選擇可能會有所不同。如果映射為 ,則迭代次數為 0。
nil
將元素添加到您正在測距的地圖中,這些條目可能會被循環訪問,也可能不會被循環訪問,您不應該假設與此相關的任何事情。

TA貢獻1828條經驗 獲得超4個贊
其他答案已經解釋了您在代碼段中觀察到的行為。
由于您的標題相當通用,但您的代碼段僅涵蓋在迭代地圖時添加地圖條目,因此這里有一個補充示例,應該說服您,在迭代地圖時“交叉刪除”地圖條目是一個壞主意(Playground):
package main
import "fmt"
func main() {
m := map[string]int{"foo": 0, "bar": 1, "baz": 2}
for k := range m {
if k == "foo" {
delete(m, "bar")
}
if k == "bar" {
delete(m, "foo")
}
}
fmt.Println(m)
}
該規范說:
未指定映射的迭代順序,也不保證從一次迭代到下一次迭代相同。如果在迭代期間移除尚未到達的映射條目,則不會生成相應的迭代值。
結果,程序輸出 或 ,但無法分辨哪個。map[bar:1 baz:2]map[baz:2 foo:0]
- 3 回答
- 0 關注
- 122 瀏覽
添加回答
舉報