以下のコードを実行すると何が起こるでしょうか?
package main
import "fmt"
const a int = 2
type number = int
type int = float64
func main() {
const b int = 2
const c number = 2
fmt.Println(1 / a, 1 / b, 1 / c)
}
-
0 0.5 0
が出力される -
0.5 0.5 0
が出力される -
0.5 0.5 0.5
が出力される - コンパイルエラー
回答
0.5 0.5 0.5
が出力されます. block と scope の問題で type alias はあまり関係ありません.
Go標準の int
等の識別子は最も外側のブロックである universe block
に存在し,内側のブロックで再宣言可能です.また,上記コードで宣言した number
や int
は package block
なので main
パッケージ全体で有効です.言い換えれば,上記のコードに現れる int
は type
宣言の前か後かに関わらず全て main
パッケージの int
でそれは float64 を指します.なのでa,b,cは全て浮動小数点数型になります.