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

时间:2014-04-09 14:58:45

标签: reflection go

func main() {
    var val interface{} = 11
    fmt.Println(reflect.ValueOf(val))   
}//print out : <int Value>

但是在我传递字符串后,就像“Hello”一样,它将打印出字符串本身。 我注意到value struct有一个方法

func (v Value) String() string

它说如果v'type不是一个字符串,它返回一个形式为“[T value]”的字符串,其中T是v的类型,但是,为什么不返回类似[int 11]的东西,我也知道我应该将一个Int()函数附加到ValueOf()以获取val的实际值,但我不理解value struct,String函数和Println函数之间的内部关系

2 个答案:

答案 0 :(得分:2)

我不是Go作者或任何东西,但我认为该设计是Go的三个属性的产物:

  • Getters通常不会Get source
  • 如果fmt包可用,则使用String方法。 source
  • 隐含地满足接口

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

Reflect Documentation

答案 1 :(得分:2)

Go 1.5(2015年8月)应该允许您打印Reflect.Value()参数的实际值 review 8731旁边的commit 049b89dRob Pike (robpike)

  

fmt:特别对待reflect.Value - 作为其持有的值

     

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

     

此CL通过对fmt包进行微不足道的更改来改善这种情况:当我们看到reflect.Value作为参数时,我们会将其视为我们对待reflect.Value包裹。
  这意味着我们始终打印Value的内容,就像 Printf的参数一样。

     

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