MeWrite Docs

Go: interface conversion: interface {} is T, not U

Goの型アサーションエラーの解決方法

概要

interface{}から具体的な型への型アサーションが失敗した場合に発生するパニックです。

エラーメッセージ

panic: interface conversion: interface {} is string, not int

原因

  1. 型の不一致: アサートした型と実際の型が異なる
  2. JSONの型: encoding/jsonがfloat64を使用
  3. 動的な型: 実行時まで型が不明

解決策

1. コンマOKイディオム

1
2
3
4
5
if val, ok := i.(int); ok {
    fmt.Println("int:", val)
} else {
    fmt.Println("not an int")
}

2. 型スイッチ

1
2
3
4
5
6
7
8
switch v := i.(type) {
case int:
    fmt.Println("int:", v)
case string:
    fmt.Println("string:", v)
default:
    fmt.Printf("unknown: %T\n", v)
}

3. JSONの数値処理

1
2
3
4
5
6
7
8
var data map[string]interface{}
json.Unmarshal([]byte(`{"num": 42}`), &data)

// float64として取得(JSONのデフォルト)
if num, ok := data["num"].(float64); ok {
    intVal := int(num)
    fmt.Println(intVal)
}

よくある間違い

  • JSONの数値がfloat64になることを忘れる
  • コンマOKイディオムを使わない

Go の他のエラー

最終更新: 2025-12-09