Upgrade to Pro — share decks privately, control downloads, hide ads and more …

入門Go言語仕様 / Go Specification Untyped Constants

DQNEO
April 15, 2021

入門Go言語仕様 / Go Specification Untyped Constants

DQNEO

April 15, 2021
Tweet

More Decks by DQNEO

Other Decks in Programming

Transcript

  1. 自己紹介 • @DQNEO (ドキュネオ) • Goコンパイラ babygo の作者 ◦ https://github.com/DQNEO/babygo

    • 公式Goコンパイラ、言語仕様書コントリビュート歴有り
  2. 答え: 型が違う const x = 123 var x = 123

    var x int = 123 両辺とも型なし 両辺とも int =
  3. 型がないのでユーザ定義型に代入可能 type MyBool bool var b MyBool = true もし

    true が bool 型だったら、代入できないはず (代入可能性の解説はこちら ) https://play.golang.org/p/63VHrn7XQVY
  4. const HELLO = "hello" type MyString string var s MyString

    = HELLO もし HELLO が string型だったら、代入できない 型がないのでユーザ定義型に代入可能 (代入可能性の解説はこちら )
  5. 型がないのでいろんな型に代入可能 var y float32 = 97 var x int64 =

    'a' var z byte = 97.0 (※ ただし “representable” な場合に限る) どれも 右辺は 「左辺の型の97」扱い
  6. 種類に応じて default type がある リテラル 種類 default type 1 integer

    constant int 1.0 floating-point constant float64 'a' rune constant rune(=int32) "hello" string constant string true boolean constant bool
  7. 型を要求される文脈の例 • var x = 123 • y := 1.0

    • var ifc interface{} = 1.0 • fmt.Printf("%v", 1.0)
  8. • var x uint8 = 1.0 私は uint8型です。 私に従ってください わかりました

    default typeは、必ずしも使われるわけでは ない uint8として振る舞う default typeは使われない
  9. int型変数に代入できない const HUGE = 92233720368547758070 var x = HUGE constant

    92233720368547758070 overflows int64 _人人人人人人_ > コンパイルエラー <  ̄Y^Y^Y^Y^Y^Y^ ̄
  10. float型変数には代入できる const HUGE = 92233720368547758070 var x float64 = HUGE

    fmt.Printf("%v\n", x) => 9.223372036854776e+19 精度は落ちる (当然)
  11. 二乗すると 2 になる const ROOT2 = 1.41421356237309504880168872420969807856 967187537694807317667974 fmt.Println(ROOT2 *

    ROOT2) // => 2 _人人人人人人_ > 精度高すぎ <  ̄Y^Y^Y^Y^Y^Y^ ̄
  12. 変数を経由すると精度が落ちる const ROOT2 = 1.41421356237309504880168872420969807856 967187537694807317667974 f := ROOT2 //

    ここで float64に詰め替えられる fmt.Println(f * f) // => 2.0000000000000004 https://play.golang.org/p/JMtw6IZjDtP
  13. Goの言語思想 “they are just regular numbers” 型なし定数の数値は「ただの数」である const HUGE =

    92233720368547758070 const ROOT2 = 1.4142135623730950488016887242096980785696718753769 4807317667974 https://blog.golang.org/constants
  14. Goの言語思想 “they live in a kind of ideal space of

    values” 型なし定数は、型の制約のない自由な理想空間 で生きている
  15. Goの言語思想 1 1.000 1e3-99.0*10-9 '\x01' ‘a’ (= ‘0x97 ’ 97)

    '\u0001' 'b' - 'a' 1.0+3i-3.0i これらはどれも 型なし定数 1 と同等に扱える