1. ホーム
  2. go

[解決済み] interface{}をint型に変換する

2022-08-22 02:56:32

質問

JSONから値を取得してint型にキャストしようとしているのですが、うまくいきませんし、正しい方法がわかりません。

以下はエラーメッセージです。

...cannot convert val (type interface {}) to type int: need type assertion

そして、そのコード。

    var f interface{}
    err = json.Unmarshal([]byte(jsonStr), &f)
    if err != nil {
        utility.CreateErrorResponse(w, "Error: failed to parse JSON data.")
        return
    }

    m := f.(map[string]interface{})

    val, ok := m["area_id"]
    if !ok {
        utility.CreateErrorResponse(w, "Error: Area ID is missing from submitted data.")
        return
    }

    fmt.Fprintf(w, "Type = %v", val)   // <--- Type = float64
    iAreaId := int(val)                // <--- Error on this line.
    testName := "Area_" + iAreaId      // not reaching here

どのように解決するのですか?

の代わりに

iAreaId := int(val)

を使いたい場合は 型のアサーション :

iAreaId := val.(int)
iAreaId, ok := val.(int) // Alt. non panicking version 

ができない理由は 変換 ができない理由は、参照された仕様の部分にあるこれらの規則です。

変換は、以下のような形式の式です。 T(x) ここで T は型であり x はT型に変換可能な式である。

...

<ブロッククオート

定数でない値xは、これらのどの場合にもT型に変換することができます。

  1. xはTに代入可能である。
  2. xの型とTは同じ基礎型を持つ。
  3. x の型と T は無名のポインタ型で、それらのポインタベース型は同一の基礎となる型を持っています。
  4. x の型と T は共に整数型または浮動小数点型です。
  5. x の型と T は両方とも複素数型です。
  6. xは整数またはバイトやルーンのスライスで、Tは文字列型です。
  7. xは文字列で、Tはバイトまたはルーンのスライスです。

しかし

iAreaId := int(val)

ではない 1.~7.のいずれかの場合です。