0Pricing
Go Academy · レッスン

型アサーションと型switch

安全な型アサーションとswitchパターン

「型アサーションと型switch」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

型アサーション

型アサーションは、インターフェースから具体的な値を取り出します。構文はx.(T)です:

package main
import "fmt"

func main() {
    var i interface{} = "hello"
    s := i.(string)          // panics if wrong type
    fmt.Println(s, len(s))   // hello 5
}

安全な2値アサーション

型が正しくない場合のパニックを避けるには、comma-ok形式を使います:

package main
import "fmt"

func main() {
    var i interface{} = 42
    s, ok := i.(string)
    fmt.Println(s, ok)  // "" false
    n, ok := i.(int)
    fmt.Println(n, ok)  // 42 true
}

型スイッチ

型スイッチは、インターフェースの値の動的な型を複数の型と比較します:

package main
import "fmt"

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 bool:   return fmt.Sprintf("bool: %v", v)
    default:     return fmt.Sprintf("unknown: %T", v)
    }
}

func main() {
    fmt.Println(describe(42))
    fmt.Println(describe("hi"))
    fmt.Println(describe(3.14))
}

errorに対する型スイッチ

型スイッチは、エラーを分類する場合に特に役立ちます:

package main
import ("errors"; "fmt")

type NotFoundError struct{ Name string }
func (e *NotFoundError) Error() string { return e.Name + " not found" }

type PermError struct{}
func (e *PermError) Error() string { return "permission denied" }

func handle(err error) {
    switch e := err.(type) {
    case *NotFoundError: fmt.Println("missing:", e.Name)
    case *PermError:     fmt.Println("perm error")
    default:             fmt.Println("other:", e)
    }
}

func main() {
    handle(&NotFoundError{"user"})
    handle(errors.New("generic"))
}

インターフェースへのアサーション

具体的な型だけでなく、別のインターフェース型に対してアサーションすることもできます。これは、オブジェクトが省略可能な振る舞いをサポートしているか確認する場合に便利です:

package main
import "fmt"

type Flusher interface{ Flush() }

type Writer interface{ Write(string) }

type BufferedWriter struct{ buf string }
func (b *BufferedWriter) Write(s string) { b.buf += s }
func (b *BufferedWriter) Flush()         { fmt.Println(b.buf); b.buf = "" }

func maybeFlush(w Writer) {
    if f, ok := w.(Flusher); ok { f.Flush() }
}

func main() {
    bw := &BufferedWriter{}
    bw.Write("hello")
    maybeFlush(bw)
}

nilインターフェースへのアサーション

nilインターフェースに対してアサーションするとパニックが発生します。アサーションする前に、必ずインターフェースがnilでないことを確認してください:

package main
import "fmt"

func safePrint(i interface{}) {
    if i == nil {
        fmt.Println("nil")
        return
    }
    fmt.Printf("%T: %v\n", i, i)
}

func main() {
    safePrint(nil)
    safePrint(42)
}

reflect.TypeOfの代替手段

アサーションせずに型を表示するには、fmt.Sprintf("%T", v)またはreflect.TypeOf(v)を使います:

package main
import ("fmt"; "reflect")

func main() {
    v := []int{1, 2, 3}
    fmt.Printf("%T\n", v)             // []int
    fmt.Println(reflect.TypeOf(v))    // []int
}

型アサーションと型変換

型アサーション:インターフェースから具体型を取り出します。型変換:ある具体型を、互換性のある別の型に変換します。これらは異なる操作です:

package main
import "fmt"

func main() {
    var i interface{} = int32(5)
    n := i.(int32)          // assertion — OK
    big := int64(n)         // conversion — OK
    fmt.Println(n, big)
}

select における comma-ok

comma-ok パターンは、チャネルの受信にも使用して、チャネルがクローズされているかどうかを検出できます。Go では、同じ簡潔なイディオムを一貫して使用します。

型スイッチを使う場面

一般的な使用例:

  • interface{} フィールドを使った JSON のアンマーシャリング
  • エラーの分類
  • プロトコルメッセージの振り分け
  • オプションのインターフェースチェック(Flusher、Closer など)

確認問題

失敗する非セーフ型アサーションの結果はどうなりますか?

まとめ

重要なポイント:

  • x.(T) は型が異なると panic になります。x, ok := x.(T) は安全です
  • 型スイッチを使うと複数の型を明確に処理できます
  • オプションの機能を確認するには、インターフェースに対してアサーションします
  • nil インターフェースに対してアサーションしてはいけません

練習課題

型スイッチを使って int、float64、string(文字列をパースします)の値を処理し、それ以外をスキップする sum(values []any) float64 関数を作成してください。

よくある質問

「型アサーションと型switch」レッスンは無料ですか?

はい。「型アサーションと型switch」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「型アサーションと型switch」で何を学びますか?

安全な型アサーションとswitchパターン ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「型アサーションと型switch」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. インターフェースの定義と実装
  2. 標準ライブラリの主要インターフェース
  3. 型アサーションと型switch
  4. インターフェースのコンポジションとベストプラクティス
← Go Academyに戻る