我有一个变量数据,它是一个接口。 当我打印其类型时,将其获取为json.Number。 如何将强制类型转换为int / int64 / float64
如果我尝试数据。(float64),最终会出现紧急错误
1 | panic: interface conversion: interface {} is json.Number, not float64 |
-
data.(json.Number).Int64() 您将assert键入实际的基础类型,而不是您希望的任意类型。这意味着,如果接口基础类型为json.Number ,则将其断言为json.Number 。 Go中的v.(T) 也不是转换而是类型断言。 - Go完全不支持类型转换。仅类型转换。
- @mkopriva-如果已经具有基础类型,为什么他必须根本输入assert?
- @horsehair,因为Go在编译类型时不知道基础类型,而类型断言是一种测试,可以帮助您在运行时确定接口值的基础类型。如果您需要使用基础类型的"功能"而不是接口类型的"功能",这将很有用。
- @mkopriva-很有道理。但是,在那种情况下,为什么不能做data。(string)(或任何任意数据类型)呢?为什么编译器不只是在适当的地址上抓取字节并将其转换?相反,在编译时会收到Kuzon(提问者)所做的错误-因此编译器似乎确实知道该接口(位于)中的数据类型。
- @horsehair恐慌是运行时错误,而不是编译时错误。
- @mkopriva-谢谢。在运行时如何知道该内存被json.Number(不是float64)占用?
-
@horsehair类型信息存储在Gos运行时系统中。同样,虽然
json.Number 的基础类型可能是string ,但这两种类型并不相同,因此将一种类型声明为另一种类型注定会失败,但是可以将一种类型转换为另一种类型。 - @mkopriva再次感谢您提供的所有出色信息。祝你有美好的一天
查看此文档以了解
https://golang.org/pkg/encoding/json/#Number
1 | f, err := data.(json.Number).Float64() |
- 作为一个新手,这样的例子正是我所需要的。 尽管所引用的文档是准确的,但缺少有关如何使用该功能的直接说明。 谢谢!