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
方法(如果可用(。来源 - 隐含地满足接口
第一个导致了Int
、Float
、Bool
、String
等方法。如果对错误类型的值进行调用,除String
外,所有这些方法都会死机。这是因为String
会被fmt使用,可能还有许多其他包来获得值的字符串表示,而且只打印字符串值肯定是不合理的。可以说,应该有另一种方法返回底层字符串,而不是String
,但这意味着api的一致性较差,所以他们选择了两害相权取其轻。
反射文档
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
的参数一样。这可以说是一个突破性的改变,但我认为这是一个真正的改进,并不比我们对这个包的格式化输出所做的许多其他调整更大。