即使实际值在uint32的范围内,为什么将接口{}转换为uint32也不起作用

时间:2018-02-28 16:01:38

标签: go yaml

我尝试从YAML字符串中检索值,并使用gopkg.in/yaml.v2将其存储为uint32

当我尝试按如下方式转换值foo时,收到一条错误消息:panic: interface conversion: interface {} is int, not uint32。我无法理解为什么会看到错误消息的原因,因为值foo实际上是3且它在uint32范围内。

var myYaml = `
foo: 3
`

type SampleYaml struct {
        Foo interface{}
}

func main() {
        var sampleYaml SampleYaml
        var uint32Val uint32

        yaml.Unmarshal([]byte(myYaml), &sampleYaml)

        uint32Val = sampleYaml.Foo.(uint32)
        fmt.Println(uint32Val)
}

这是我遇到的actual code

1 个答案:

答案 0 :(得分:0)

来自规范:

  

如果来自v。(T)的T不是接口类型,则此类断言检查v的动态类型是否与T

相同

当您键入断言时,v的动态类型必须与T相同,根据您的错误消息,动态类型为int并且您尝试将其断言为uint32因为它们不相同而不会起作用。

你可能想做这样的事情:

uint32Val = uint32(sampleYaml.Foo.(int))

首先使用类型断言从int获取interface{},然后使用类型强制来获取uint32