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

Goと定数 DMM.go #3

teru0x1
July 20, 2021

Goと定数 DMM.go #3

teru0x1

July 20, 2021
Tweet

More Decks by teru0x1

Other Decks in Programming

Transcript

  1. © DMM.com
    Goと定数
    小野 輝也
    DMM.go #3
    2021/07/20

    View Slide

  2. © DMM.com
    自己紹介
    • 2021年新卒入社
    • ITインフラ本部 SRE部
    • 今週から配属されました
    • 普段はGoでWebアプリを書いたりRust
    でネットワークプログラミングをする同人
    誌を書いたりしています
    2
    小野 輝也(おの てるや)
    Twitter: @teru0x1

    View Slide

  3. © DMM.com
    今回お話しする内容
    • Goにおける定数の基本
    • Goにおける定数の上手な使い方
    3

    View Slide

  4. © DMM.com
    定数
    a: float64, 1
    b: string, Welcome to DMM.go
    c: string, Welcome to DMM.go
    d: int, 3
    e: complex128, (2+3i)
    f: bool, false
    true: bool, false
    4
    • 定数になれるのはboolean, rune, integer,
    floating-point, complex, stringのみ
    • 定義を空にすると直上の式をコピーする
    • コンパイル時に値は決定される
    const (
    true = 0 == 0
    false = 0 != 0
    )
    builtin.go

    View Slide

  5. © DMM.com
    iota
    • 定数の生成器
    • const ( … )に含まれる定数定義の0から始まるインデックスを返す
    • 同じ行に含まれるiotaは同じ値を返す
    • 擬似的にEnumを作る時などに利用する
    5

    View Slide

  6. © DMM.com
    定数について話そうと思った経緯
    6
    ❌ invalid operation: a * time.Second
    (mismatched types int and time.Duration)
    ✅ OK

    View Slide

  7. © DMM.com
    Goの計算ルール
    • 型が一致しているもの同士が計算できる
    • int64とint8で四則演算することはできない
    • 明示的な型変換が必要
    7
    ❌ invalid operation: a + b
    (mismatched types int64 and int8)
    ✅ OK

    View Slide

  8. © DMM.com
    定数
    • constキーワードを用いて定義(例: const a = “hello”)
    • 左辺: named constant
    • 右辺: unnamed constant
    • これらはどちらも“untyped constant”に分類される
    • リテラルのフォーマットをもとにstringやfloatなどに分類される
    • ”hello”: untyped string constant
    • 1.23: untyped float constant
    • 1 + 5i: untyped complex constant
    • 定数には型を明示することもできる(例: const a int = 3)
    8

    View Slide

  9. © DMM.com
    untyped constant
    • 明示的な型の情報を持たない定数
    • 「型が厳密に一致していないと四則演算できない」というルールからは外
    れる
    • デフォルト型を持つ
    9
    ❌ a, bは型の情報を持つため掛け算で
    きない
    invalid operation: a * b (mismatched
    types int and float64)
    ✅ a, bはuntyped constantなので掛け算
    できる

    View Slide

  10. © DMM.com
    デフォルト型
    • untyped constantが持つ暗黙的な型
    • 型が必要となった際、明示された型情報がない場合はデフォルト型が利
    用される
    • シンタックスにより決定される
    10
    結果:
    float64, main.MyFloat64
    a: 1.5のデフォルト型(float64)
    b: 明示的な型(MyFloat64)

    View Slide

  11. © DMM.com
    untyped constantsの例
    11

    View Slide

  12. © DMM.com
    untyped float
    • 任意の精度、桁数を持つ
    • 高い精度での計算が可能
    • 例: mathパッケージの定数(const.go)
    • 変数に代入などしてしまうとfloat64またはfloat32になる
    • そのため、幾らかの情報は失われてしまう
    • untyped float同士でできる限り計算すると高い精度を維持できる
    12
    math/const.go

    View Slide

  13. © DMM.com
    複数の型になれるuntyped
    • 定数値によっては様々な型になることができるものもある
    • 虚部が0のcomplexならfloat, intに
    • 小数部分が0のfloatならintに
    13

    View Slide

  14. © DMM.com
    最初に戻ると
    • 左: untyped int constantとtime.Durationの積
    • time.Secondはtime.Dutation constant(typed)
    • time.Durationはint64のDefined Type (type Dutation int64)
    • 右: intとtime.Durationの積
    14
    ❌ invalid operation: a * time.Second
    (mismatched types int and
    time.Duration)
    ✅ OK

    View Slide

  15. © DMM.com
    まとめ
    • Goの定数には柔軟性・利便性を支える様々な仕組みがある
    • iota
    • 定数定義の省略による式コピー
    • untyped constants
    • 定数を定義するときにはuntypedをうまく活用し、
    型の決定をなるべく遅らせるのがGood
    15

    View Slide

  16. © DMM.com
    参考
    • GoのLanguage Specification
    • https://golang.org/ref/spec#Constant_declarations
    • https://golang.org/ref/spec#Constant_expressions
    • https://golang.org/ref/spec#Types
    • https://blog.golang.org/constants
    16

    View Slide