2017-11-12 11 views
0
package main 

import "time" 
import "fmt" 

var i int = 0 

func loopInc() { 
    for { 
     i++ 
    } 
} 

func main() { 
    go loopInc() 
    <-time.After(1 * time.Millisecond) 
    fmt.Println(i) 
} 

は、このコードは常に0なぜこのコードは未定義の動作ですか?

を印刷し、私は実行可能ファイルをダンプして行く私のloopInc関数は、何も行わないループにコンパイルされたことがわかりました。 i++は存在しません。

なぜですか?

答えて

3

これはすべてGo Memory Modelで説明しています。

この例では、iをインクリメントしてからiをインクリメントするまでには何も起こりません。関係が起こる前に起こることはないので、メインのゴルーチンはiへの変更を見たり、表示したりしないことがあります。

i++は、iへの変更が確実に行われる保証がないため、コンパイラはi++を最適化することができます。

関連する問題