型アサーションと型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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- インターフェースの定義と実装
- 標準ライブラリの主要インターフェース
- 型アサーションと型switch
- インターフェースのコンポジションとベストプラクティス