将接口{}转换为Golang中的int
我是新来的Golang,我试图从一个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)
你想要一个types断言 :
iAreaId := val.(int) iAreaId, ok := val.(int) // Alt. non panicking version
无法转换接口types值的原因是参考规格部分中的这些规则:
转换是forms为
T(x)
的expression式,其中T
是types,x
是可以转换为typesT的expression式。
…
在这些情况下,非常量值x可以转换为Ttypes:
- x可分配给T.
- x的types和T有相同的基础types。
- x的types和T是未命名的指针types,它们的指针基types具有相同的基础types。
- x的types和T都是整数或浮点types。
- x的types和T都是复杂的types。
- x是一个整数或一个字节或符号片段,T是一个stringtypes。
- x是一个string,T是一个字节或符文片段。
但
iAreaId := int(val)
不是任何情况下的1 – 7。
我假设:如果你通过浏览器发送的JSON值,那么你发送的任何数字将是typesfloat64,所以你不能直接获得int值在golang。
所以做这样的转换:
//如上所述:fmt.Fprintf(w,“Type =%v”,val)// <— Type = float64
var iAreaId int = int(val。(float64))
这样你可以得到确切的价值,你想要的。
我全心全意地同意zzzz的types断言的答案,我强烈的喜欢这种方式。 这就是说,当首选的方法没有奏效的时候,我必须做的事情是……(涉及到数据交叉序列的长篇故事)。 你甚至可以把它链接成一个switch
语句, case errInt == nil
和类似的expression式。
package main import "fmt" import "strconv" func main() { var v interface{} v = "4" i, errInt := strconv.ParseInt(v.(string), 10, 64) if errInt == nil { fmt.Printf("%d is a int", i) /* do what you wish with "i" here */ } }
就像我上面所说的,尝试这种方法之前先尝试inputassertion 。
为了更好地理解types转换,请看下面的代码:
package main import "fmt" func foo(a interface{}) { fmt.Println(a.(int)) // conversion of interface into int } func main() { var a int = 10 foo(a) }
此代码完美执行并将接口types转换为inttypes
对于接口types和typesT的expression式x,主expression式x。(T)声明x不是零,并且存储在x中的值是Ttypes。记号x。(T)被称为types断言。 更准确地说,如果T不是接口types,x(T)断言x的dynamictypes与Ttypes相同。在这种情况下,T必须实现x的(接口)types; 否则types断言是无效的,因为x不能存储typesT的值。如果T是接口types,则x(T)断言x的dynamictypes实现了接口T.
回到你的代码,这个
iAreaId := val.(int)
应该运作良好。 如果你想检查转换时发生的错误,你也可以重新写上面的行
iAreaId, ok := val.(int)