1 回答

TA貢獻1860條經驗 獲得超8個贊
混淆和不同輸出的根源是參數的評估順序。
看看你的例子:
m("A", a, SetAI(&a))
否則,在計算表達式、賦值或返回語句的操作數時,所有函數調用、方法調用和通信操作均按從左到右的詞匯順序進行計算。例如,在(函數局部)賦值
y[f()], ok = g(h(), i()+x[j()], <-c), k()函數調用和通信的順序為
f()
,h()
,i()
,j()
,<-c
,g()
, 和k()
。但是,與評估和索引以及評估相比,這些事件的順序未指定。x
y
所以基本上規范只保證函數調用和通信操作從左到右發生。
你的電話有參數"A"
,a
和SetAI(&a)
。無法保證第二個參數是否在傳遞給a
的參數之前被求值,這非常重要,因為會修改。由于無法保證順序,因此您不能依賴首先評估哪個順序,這兩個順序均符合規范。&a
SetAI()
SetAI()
a
如果通過復制 struct before使評估顯式,您會得到相同的結果:
a := A{}
aCopy := a
m("A", aCopy, SetAI(&a))
b := B{}
bCopy := b
m("B", bCopy, SetBI(&b))
這將輸出(在Go Playground上嘗試):
A: {0 } {10 }
B: {0} {10}
或者,如果您希望首先評估函數調用:
a := A{}
ap := SetAI(&a)
m("A", a, ap)
b := B{}
bp := SetBI(&b)
m("B", b, bp)
這將為每個案例輸出(在Go Playground10上試試這個):
A: {10 } {10 }
B: {10} {10}
- 1 回答
- 0 關注
- 128 瀏覽
添加回答
舉報