https://go.dev/ref/spec#Type_assertions
- xがインターフェース、Tがインターフェースでない場合:
- xの動的型(実行時に代入されている値の実際の型)がTに等しくなければpanic
- xがインターフェース、Tがインターフェースの場合:
- xの動的型がTを実装していなければpanic
- (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が配列のポインタ, かつ両者の要素の型が同じ
抜け漏れがありそうだけど...