モジュール 6 · レッスン 3 / 5コース内の 28/50~10 min
モジュールのレッスン (3/5)
タイプスイッチ
タイプ スイッチは、考えられる複数のタイプを識別します。
インターフェース値。これは、comma ok がある場合の一般化です。
複数のケース。
構文
Go
func describe(i interface{}) string {
switch v := i.(type) {
case int:
return fmt.Sprintf("int %d", v)
case string:
return fmt.Sprintf("string %q", v)
case nil:
return "nil"
default:
return fmt.Sprintf("altro tipo: %T", v)
}
}i.(type)は 特別な構文で、switch内でのみ有効です。v := ...は、値を現在のケースのタイプにバインドします。case int内では、vのタイプはintです。defaultは他のすべての型をキャッチします。vには元のインターフェイスのタイプがあります。case nilは、nil 動的タイプのインターフェースと一致します。
「無名」事件
型指定された値が必要ない場合は、v を省略できます。
Go
switch i.(type) {
case int:
// you know it's an int, but you don't have a variable of that type
case string:
// ...
}操作ではなく種類を判別するだけの場合に使用するフォーム 価値観について。
同じケースに複数のタイプがある
Go
switch v := i.(type) {
case int, int64:
// here v is still interface{}: the "common" type is just the interface
fmt.Println("numero intero:", v)
case string:
// here v is string
fmt.Println("stringa:", v)
}一般的な使用例: フォーマットされた印刷
Go
func print(i interface{}) {
switch v := i.(type) {
case int:
fmt.Printf("%d\n", v)
case string:
fmt.Printf("%s\n", v)
case fmt.Stringer:
fmt.Println(v.String())
default:
fmt.Printf("%v\n", v)
}
}fmt.Println 自体は、内部で型スイッチを使用して、
標準フォーマット。
タイプスイッチとリフレクション
いくつかの既知のタイプの場合 → タイプスイッチ (高速、読み取り可能)。
未知の型の動的検査の場合 → reflect パッケージ (詳細
強力ですが、速度が遅く、冗長になります)。
試してみてください
運動#go.m6.l3.e1
試行回数: 0読み込み中…
動的タイプに応じて 'int'、'string'、または 'altro' を返す description(i Interface{}) 文字列を実装します。
エディターを読み込み中…
ヒントを表示
構文: `switch i.(type) { case T: ... デフォルト: ... }`。
3 回の試行後に解決策が利用可能になります
運動#go.m6.l3.e2
試行回数: 0読み込み中…
v := i.(type) を使用し、int の場合は %d、string の場合は %s で出力する printVal(i Interface{}) を作成します。
エディターを読み込み中…
ヒントを表示
`case int` 内では、v の型は int です (これを Printf に渡すことができます)。
3 回の試行後に解決策が利用可能になります
Quiz#go.m6.l3.e3
準備完了型切り替えを開始する構文はどれですか?
Go
switch ??? {
case int: ...
}要約
switch v := i.(type) { case T: ... }: 動的タイプを判別します。- 単一タイプのケース内では、
vがケースのタイプを持ちます。 case T1, T2:vは、元のインターフェイスのタイプを保持します。- 未処理のケースの場合は
default。 nil インターフェースの場合はcase nil。 - タイプ スイッチに
fallthroughはありません。 - 1 タイプ → タイプ アサーション; 2+タイプ→タイプスイッチ。