我有一个变量数据,它是一个接口。 当我打印其类型时,将其获取为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再次感谢您提供的所有出色信息。祝你有美好的一天

查看此文档以了解json.Number上的可用方法:
https://golang.org/pkg/encoding/json/#Number

1
f, err := data.(json.Number).Float64()
  • 作为一个新手,这样的例子正是我所需要的。 尽管所引用的文档是准确的,但缺少有关如何使用该功能的直接说明。 谢谢!