2013-08-04 53 views
59

我是新来Golang,我试图让从JSON的值,将它转换成int诠释,但它不工作。不知道如何正确地做到这一点。转换接口{}在Golang

以下是错误消息:

...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 

任何帮助,将不胜感激。

回答

108

而不是

iAreaId := int(val) 

你想type assertion

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

你之所以不能convert接口类型值是这些规则所引​​用的规范部分:

转换表达式为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。

+0

很好的答案!语言规范始终是寻找答案的最佳地点! –

+0

谢谢。这是一个美丽的答案。 – Muktadir

+0

不是JSON输入的正确答案。见下文。 – Liam

11

我假设:如果你通过浏览器发送的JSON值,那么任何号码,你发送的将是类型float64所以你不能获得价值直接诠释在golang。

所以做这样的转换:

//作为,说:fmt.Fprintf(W “类型=%V”,VAL)// < ---类型= float64

VAR iAreaId int = int(val。(float64))

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

1

我全心全意地同意zzzz类型断言答案,我非常喜欢那种方式。这就是说,当首选方法没有奏效时,我必须做的事情......(长篇故事涉及到数据的交叉串行化)。你甚至可以用case errInt == nil和类似的表达式将它链接到switch声明中。

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 */ 
    } 
} 

就像我上面说的,尽量类型断言尝试这种方式之前,首先。

0

为了更好地理解类型转换,看看下面的代码:

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) 
} 

此代码执行完美并转换接口类型为int类型

对于表达式x接口类型和的类型T,主要表达式 x。(T)断言x不是零,并且存储在x中的值是T类型。记号x。(T)被称为类型断言。更确切地说,如果T不是接口类型,x。(T)断言x的动态类型与T类型相同。在这种情况下,T必须实现x的(接口)类型;否则类型断言是无效的,因为x不能存储类型T的值。如果T是接口类型,x。(T)断言x的动态类型实现接口T.

让我们回到你的代码,这

iAreaId := val.(int)

应该工作良好。如果您想检查时出错,转换,你也可以重新写上面的线

iAreaId, ok := val.(int)

-1

最好避免铸造,宣布F到为F正确的类型对应于JSON。

0

您需要输入断言来将您的接口转换为int值。

iAreaId := val.(int) 
iAreaId, ok := val.(int)`\ 

更多的信息是available