Значение, возвращаемое из refle.ValueOf содержит конкретное значение, сохраненное в аргументе.Если аргумент равен nil, возвращается нулевое отражение. Значение:.
Другими словами, отражающее значение и интерфейс, переданные в отражение. Значение имеют одно и то же значение.
Функции main1
и main2
будут работать так, как я думаю, вы ожидаете, если вы f
измените на:
func f(x interface{}) { // print x's underlying value
fmt.Println(reflect.ValueOf(x))
}
Аргументом f
в main3
является *struct{}
.Функция f
разыменовывает указатель (с вызовом Elem ()) и печатает значение отражения для struct{}
.
. Единственное, что может сбить с толку, это то, что reflect.ValueOf(ptr).Elem().Elem().Interface()
и reflect.ValueOf(ptr).Elem().Interface()
возвращаютинтерфейс с тем же конкретным значением.
Выражение reflect.ValueOf(ptr).Elem()
является значением отражения, соответствующим i
.Вызов Interface()
для этого значения возвращает интерфейс с конкретным значением в i
.
Выражение reflect.ValueOf(ptr).Elem().Elem()
является значением отражения, соответствующим конкретному значению i
.Вызов Interface()
для этого значения возвращает интерфейс, содержащий это конкретное значение.