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函数之间的内部关系
答案 0 :(得分:2)
我不是Go作者或任何东西,但我认为该设计是Go的三个属性的产物:
第一种方法导致Int
,Float
,Bool
,String
等方法。如果调用错误类型的值,所有这些方法都会出现混乱,String
除外。这是因为fmt将使用String
,并且可能有许多其他包来获取值的字符串表示,并且仅对字符串值进行打印肯定是不合理的。可以说应该有另一种方法返回底层字符串而不是String
,但这意味着api的一致性较差,所以他们选择了两个邪恶中较小的一个。
答案 1 :(得分:2)
Go 1.5(2015年8月)应该允许您打印Reflect.Value()
参数的实际值
review 8731旁边的commit 049b89d和Rob Pike (robpike
):
fmt
:特别对待reflect.Value
- 作为其持有的值当
reflect.Value
传递给Printf
(等)时,fmt
会调用String
方法,但不会透露其内容。
要获取内容,可以调用Value.Interface()
,但这是非法的 如果Value
未导出或以其他方式被禁止。此CL通过对
fmt
包进行微不足道的更改来改善这种情况:当我们看到reflect.Value
作为参数时,我们会将其视为我们对待reflect.Value
包裹。
这意味着我们始终打印Value
的内容,就像 是Printf
的参数一样。这可以说是一个突破性的变化,但我认为这是一个真正的改进,并没有比我们对这个包的格式化输出所做的许多其他调整更大的突破。