为了账号安全,请及时绑定邮箱和手机立即绑定

将 interface{} 转换为 int

将 interface{} 转换为 int

Go
绝地无双 2021-06-10 22:49:20
我正在尝试从 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
查看完整描述

3 回答

?
米脂

TA贡献1836条经验 获得超3个赞

我假设:如果您通过浏览器发送 JSON 值,那么您发送的任何数字都将是 float64 类型,因此您无法在 golang 中直接获取该值。


所以做这样的转换:


//As that says: 

fmt.Fprintf(w, "Type = %v", val) // <--- Type = float64


var iAreaId int = int(val.(float64))

这样你就可以得到你想要的确切价值。


查看完整回答
反对 回复 2021-06-21
?
不负相思意

TA贡献1777条经验 获得超10个赞

添加另一个使用的答案switch......那里有更全面的例子,但这会给你这个想法。


例如,t成为每个case范围内的指定数据类型。请注意,您必须case在一个类型中仅提供一种类型,否则t仍然是interface.


package main


import "fmt"


func main() {

    var val interface{} // your starting value

    val = 4


    var i int // your final value


    switch t := val.(type) {

    case int:

        fmt.Printf("%d == %T\n", t, t)

        i = t

    case int8:

        fmt.Printf("%d == %T\n", t, t)

        i = int(t) // standardizes across systems

    case int16:

        fmt.Printf("%d == %T\n", t, t)

        i = int(t) // standardizes across systems

    case int32:

        fmt.Printf("%d == %T\n", t, t)

        i = int(t) // standardizes across systems

    case int64:

        fmt.Printf("%d == %T\n", t, t)

        i = int(t) // standardizes across systems

    case bool:

        fmt.Printf("%t == %T\n", t, t)

        // // not covertible unless...

        // if t {

        //  i = 1

        // } else {

        //  i = 0

        // }

    case float32:

        fmt.Printf("%g == %T\n", t, t)

        i = int(t) // standardizes across systems

    case float64:

        fmt.Printf("%f == %T\n", t, t)

        i = int(t) // standardizes across systems

    case uint8:

        fmt.Printf("%d == %T\n", t, t)

        i = int(t) // standardizes across systems

    case uint16:

        fmt.Printf("%d == %T\n", t, t)

        i = int(t) // standardizes across systems

    case uint32:

        fmt.Printf("%d == %T\n", t, t)

        i = int(t) // standardizes across systems

    case uint64:

        fmt.Printf("%d == %T\n", t, t)

        i = int(t) // standardizes across systems

    case string:

        fmt.Printf("%s == %T\n", t, t)

        // gets a little messy...

    default:

        // what is it then?

        fmt.Printf("%v == %T\n", t, t)

    }


    fmt.Printf("i == %d\n", i)

}


查看完整回答
反对 回复 2021-06-21
  • 3 回答
  • 0 关注
  • 378 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信