func main() {
var val interface{} = 11
fmt.Println(reflect.ValueOf(val))
}//print out : <int Value>
但是在我将字符串(如“Hello”)传递给 val 之后,它会打印出字符串本身。 我注意到值结构有一个方法
func (v Value) String() string
它说如果 v'type 不是一个字符串,它返回一个形式为“[T value]”的字符串,其中 T 是 v 的类型,但是,为什么不返回类似 [int 11] 的东西,我也知道我应该在 ValueOf() 上附加一个 Int() 函数来获取 val 的实际值,但我不明白值结构与 String 函数和 Println 函数之间的内部关系
最佳答案
我不是 Go 作者或任何人,但我认为该设计是 Go 三个属性的产物:
第一个导致像 Int
、Float
、Bool
、String
等方法。所有这些如果调用错误类型的值(String
除外),方法将崩溃。这是因为 String
将被 fmt 使用,并且可能还有许多其他包来获取该值的字符串表示形式,并且仅字符串值可打印肯定是不合理的。可以说应该有另一种方法返回底层字符串而不是 String
,但这将意味着 api 的一致性较低,因此他们选择了两害相权取其轻。
关于reflection - 为什么 reflect.ValueOf 不能在 golang 中使用 Println 打印出 int 的真实值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22966494/