将接口{}转换为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:

  1. x可分配给T.
  2. x的types和T有相同的基础types。
  3. x的types和T是未命名的指针types,它们的指针基types具有相同的基础types。
  4. x的types和T都是整数或浮点types。
  5. x的types和T都是复杂的types。
  6. x是一个整数或一个字节或符号片段,T是一个stringtypes。
  7. 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)