【发布时间】:2018-07-04 17:43:52
【问题描述】:
我有一个可变数据,它是一个接口。当我打印它的类型时,我得到它作为 json.Number。如何将类型转换为 int/int64/float64
如果我尝试 data.(float64),它最终会出现恐慌错误
panic: interface conversion: interface {} is json.Number, not float64
【问题讨论】:
-
data.(json.Number).Int64()您将 assert 输入到实际的底层类型,而不是您希望的任意类型。这意味着如果一个接口的底层类型是json.Number,那么您将其断言为json.Number。而且 Go 中的v.(T)不是转换,而是类型断言。 -
Go 根本不支持类型转换。仅类型转换。
-
@horsehair 因为 Go 在编译类型时不知道底层类型,而类型断言是一种测试,可帮助您在运行时确定接口值的底层类型。如果您需要使用底层类型的“特性”而不是接口类型的“特性”,这将非常有用。
-
@horsehair 恐慌是运行时错误,而不是编译时错误。
-
@horsehair 类型信息存储在 Go 的运行时系统中。此外,虽然
json.Number的基础类型可能是string,但两种类型并不相同,因此 type-asserting 一个到另一个肯定会失败,但是 converting 一个对另一个是可以的。
标签: go go-interface