が行く1.8で評価された、以下ゴー機能(playground)を考えてみましょう:Goでは、値はマルチバリューの割り当てにいつコピーされますか?
func f() (int, bool) {
i := 0
c := make(chan bool)
go func() {
time.Sleep(1 * time.Second)
i = 1
c <- true
}()
// In practice, `i` will always be 0 here.
return i, <-c // returns 1, true
}
をコメントで述べたように、機能がc
後i
が値をもたらした、常にコピーしているようです。 return文が出てから1秒後に起こるので、これは私が期待したものではありません。
リターンで値の順序が逆になっている場合と、リターンが代入に置き換えられた場合の動作は同じです。
私はこの動作が間違っていると主張しているわけではないことに注意してください。実際には、これはほとんどいつもあなたが起こりたいものです。
このように意図された/指定された動作が信頼できるのかどうかは疑問です。
receive operatorの仕様のセクションでは、このような場合にスレッドをブロックするタイミングを正確に示していません。