タイトルの詳細を少し気になったので思ったので調べてみた。
fmt.Scan
関数で読み取る変数は、ポインタでなければならない。
これは、fmt.Scan
関数が読み取った値を呼び出し元の変数に格納するためにポインタを使用するためです。
具体的には、fmt.Scan
関数は、与えられた引数のアドレスに対して読み取った値を格納します。
したがって、呼び出し元の変数のアドレスを渡す必要があります。
これは、値渡しではなく、参照渡しの仕組みです。
例えば、以下のコードでは、fmt.Scan
によって&x
、&y
に対して読み取りが行われています。
var x, y int
fmt.Scan(&x, &y)
ここで、&
はアドレス演算子で、&x
は変数xのアドレスを表します。
fmt.Scan
関数は、引数に渡されたアドレスに対して読み取った値を格納するため、&x
や&y
のようなポインタが必要となります。