第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

函數(shù)參數(shù)的求值順序是什么?

函數(shù)參數(shù)的求值順序是什么?

Go
哆啦的時光機 2022-11-28 10:42:56
我正在使用這個版本的 Go:$ go versiongo version go1.18 windows/amd64當structA只有一個字段和B有兩個或以上字段時結(jié)果不同,而且只有當參數(shù)類型是interface時才會出現(xiàn)這種情況。我不確定這是否是一個錯誤:package mainimport (    "fmt")func main() {    a := A{}    m("A", a, SetAI(&a))    b := B{}    m("B", b, SetBI(&b))}type A struct {    I int    S string}type B struct {    I int}func SetAI(a *A) A {    a.I = 10    return *a}func SetBI(b *B) B {    b.I = 10    return *b}func m(name string, arg1, arg2 interface{}) {    fmt.Println(name+":", arg1, arg2)}我期待這個輸出:A: {10} {10}B: {10} {10}相反,我得到了這個:A: {0 } {10 }B: {10} {10}
查看完整描述

1 回答

?
桃花長相依

TA貢獻1860條經(jīng)驗 獲得超8個贊

混淆和不同輸出的根源是參數(shù)的評估順序。

看看你的例子:

m("A", a, SetAI(&a))

這是一個函數(shù)調(diào)用,函數(shù)值和參數(shù)按通常的順序求值:

否則,在計算表達式、賦值或返回語句的操作數(shù)時,所有函數(shù)調(diào)用、方法調(diào)用和通信操作均按從左到右的詞匯順序進行計算。例如,在(函數(shù)局部)賦值

y[f()], ok = g(h(), i()+x[j()], <-c), k()

函數(shù)調(diào)用和通信的順序為f()h()i()j()<-cg(), 和k()。但是,與評估和索引以及評估相比,這些事件的順序未指定。xy

所以基本上規(guī)范只保證函數(shù)調(diào)用和通信操作從左到右發(fā)生。

你的電話有參數(shù)"A",aSetAI(&a)。無法保證第二個參數(shù)是否在傳遞給a的參數(shù)之前被求值,這非常重要,因為會修改。由于無法保證順序,因此您不能依賴首先評估哪個順序,這兩個順序均符合規(guī)范。&aSetAI()SetAI()a

如果通過復(fù)制 struct before使評估顯式,您會得到相同的結(jié)果:

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}

或者,如果您希望首先評估函數(shù)調(diào)用:


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}


查看完整回答
反對 回復(fù) 2022-11-28
  • 1 回答
  • 0 關(guān)注
  • 138 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號