メインコンテンツにスキップ
モジュール 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+タイプ→タイプスイッチ。