Skip to content

Instantly share code, notes, and snippets.

@Syuparn
Last active October 1, 2022 10:57
Show Gist options
  • Save Syuparn/e5bedf1e7feb71150f721a0cec510977 to your computer and use it in GitHub Desktop.
Save Syuparn/e5bedf1e7feb71150f721a0cec510977 to your computer and use it in GitHub Desktop.
型変換と型アサーションをまじめに復習する

型アサーション x.(T)

https://go.dev/ref/spec#Type_assertions

  • xがインターフェース、Tがインターフェースでない場合:
    • xの動的型(実行時に代入されている値の実際の型)がTに等しくなければpanic
  • xがインターフェース、Tがインターフェースの場合:
    • xの動的型がTを実装していなければpanic
  • (xがインターフェースでない場合はコンパイルエラー)

型変換 T(x)

https://go.dev/ref/spec#Conversions

  • xがTに代入可能
    • https://go.dev/ref/spec#Assignability
    • xとTの型が同じ
    • xとTのunderlying typeが同じ、かつxとTのどちらかが名前を持たない(定義型でない)
    • xとTが同じ型を要素に持つchannel typeでxが双方向チャネルかつどちらかが名前を持たない
      • 双方向チャネルが単方向に代入可能というのがみそ(でなければ同じになるので)
    • TがインターフェースでxがTを実装している
    • xがnilでTがポインタ、関数、スライス、チャネル、インターフェースのいずれか
    • xがuntyped constantで、Tで表現可能
  • (タグを除き)xとTのunderlying typeが同じ
  • (タグを除き)xとTがいずれも名前を持たないポインタ型で、ポインタのbase type(実体の型?)のunderlying typeが同じ
    • (*MyInt2)(x) のようなパターン
    • ※(名前を持たない「ポインタでない型」)については、「xとTのunderlying typeが同じ」ですでにカバーされている
  • x, Tがどちらもinteger or float
  • x, Tがどちらもcomplex
  • x がinteger, []byte, []runeのいずれかで、Tがstring
  • xがstringでTが[]byte or []rune
  • xがスライスで、Tが配列のポインタ, かつ両者の要素の型が同じ

型変換 T(x) 可能性のフローチャート(選択肢が無くなったら変換不可能)

抜け漏れがありそうだけど...

conversionflow_chart

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment