In go, почему и отраженное значение, и его интерфейс одинаковы при печати?

Выдержка из Законы отражения:

(Почему бы не fmt.Println(v)? Поскольку v — это Reflect.Value; нам нужно конкретное значение, которое оно содержит.)

Это меня смущает, потому что следующий код:

var x float64 = 3.4
var v = reflect.ValueOf(x)

fmt.Println("value of x is:", v)
y := v.Interface().(float64) // y will have type float64.
fmt.Println("interface of value of x is:", y)

Печатает тот же вывод:

значение х: 3,4

интерфейс значения x: 3.4

Это потому, что fmt внутренне находит конкретное значение для отраженного v?


person Paul Razvan Berg    schedule 24.09.2018    source источник


Ответы (1)


Это особый случай, описанный в методе String() элемента reflect.Value. Здесь утверждается

Пакет fmt специально обрабатывает значения. Он не вызывает их метод String неявно, а вместо этого печатает конкретные значения, которые они содержат.

person Leon    schedule 24.09.2018
comment
Ах да, ха-ха, я пропустил эту часть документа: We call the String method explicitly because by default the fmt package digs into a reflect.Value to show the concrete value inside. The String method does not. - person Paul Razvan Berg; 24.09.2018