为什么要反思.ValueOf无法在golang中使用Println打印出int的真值


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的类型,但是,为什么不返回像[int11]这样的东西呢?我也知道我应该在ValueOf((后面附加一个int((函数来获得val的实际值,但我不理解value struct、string函数和Println函数之间的内部关系

我不是围棋的作者,但我认为这个设计是围棋三个特性的产物:

  • 吸附器通常关闭Get
  • fmt包使用String方法(如果可用(。来源
  • 隐含地满足接口

第一个导致了IntFloatBoolString等方法。如果对错误类型的值进行调用,除String外,所有这些方法都会死机。这是因为String会被fmt使用,可能还有许多其他包来获得值的字符串表示,而且只打印字符串值肯定是不合理的。可以说,应该有另一种方法返回底层字符串,而不是String,但这意味着api的一致性较差,所以他们选择了两害相权取其轻。

反射文档

Go 1.5(2015年8月(应该允许您打印Reflect.Value()参数的实际值
参见Rob Pike的审查8731和提交049b89d(robpike(:

fmt:将reflect.Value特殊处理为它所持有的值

reflect.Value被传递给Printf(等等(时,fmt调用String方法,该方法不公开其内容
要获取内容,可以调用Value.Interface(),但这是非法的如果CCD_ 19未被导出或以其他方式被禁止。

这个CL通过对fmt包进行一个微不足道的更改来改善这种情况:当我们将reflect.Value视为自变量时,我们对待它的方式与对待包内生成的reflect.Value的方式完全相同
这意味着我们总是打印Value的内容,就好像是Printf的参数一样。

这可以说是一个突破性的改变,但我认为这是一个真正的改进,并不比我们对这个包的格式化输出所做的许多其他调整更大。

相关内容

  • 没有找到相关文章

最新更新