reflection - 为什么 reflect.ValueOf 不能在 golang 中使用 Println 打印出 int 的真实值

标签 reflection go

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 三个属性的产物:

  • getter 通常会停止 Get source
  • fmt 包使用String 方法(如果可用)。 source
  • 隐式满足接口(interface)

第一个导致像 IntFloatBoolString 等方法。所有这些如果调用错误类型的值(String 除外),方法将崩溃。这是因为 String 将被 fmt 使用,并且可能还有许多其他包来获取该值的字符串表示形式,并且仅字符串值可打印肯定是不合理的。可以说应该有另一种方法返回底层字符串而不是 String,但这将意味着 api 的一致性较低,因此他们选择了两害相权取其轻。

Reflect Documentation

关于reflection - 为什么 reflect.ValueOf 不能在 golang 中使用 Println 打印出 int 的真实值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22966494/

相关文章:

c# - 使用反射等效于 default(T)

java - 我可以使用 CDI 查找任何 bean 中所有带限定符注释的方法吗?

pointers - 如何通过引用设置接口(interface){}参数?

java - 使用java中的类对象创建通用列表

java - 在 Java Bean 中获取 "last visited field"

Java:通过泛型类型的反射调用特定方法

http - http:ContentLength = 105,正文长度为0

go - 如果它已启动并正在运行以获取连接,如何使用 golang 查询 redis Db?

file - 在 Golang 中写入响应后,HTTP 请求被中止

go - 重新连接外部数据库的好模式是什么?