2016-06-11 2 views
0

Я пытаюсь понять представление значения отражения:отражение представления var в отличие от интерфейса.

type S struct { 
    F string `species:"gopher" color:"blue"` 
} 

var x float64 = 3.4 
v := reflect.ValueOf(x)  
fmt.Println("v = ", v)  // v = 3.4 


s := S{} 
ss := reflect.ValueOf(s) 
fmt.Println("ss = ", ss) // ss = {} 

Я понимаю, что представление значения интерфейса отражения двух слов пара, что дает указатель на тип информации и указатель на связанный с ним стоимость.

Что такое представление отражения переменной. Является ли это просто значение, и если да, то как тип определяется кодом ниже:

fmt.Println("type:", reflect.TypeOf(x)) 

Если представление только значение, так как это, кажется, где же код выше найти информацию о типе?

+0

Все, что вы передаете, чтобы отразить, находится в интерфейсе. Подпиской TypeOf является 'func TypeOf (i interface {}) Тип' – JimB

ответ

1

Тип reflect.TypeOf является:

func TypeOf(i interface{}) Type 

При вызове reflect.ValueOf(x) в коде, значение x неявно преобразуется в interface{}. Во время компиляции известен тип x (float64), а значение интерфейса представлено так, как вы уже знаете; в виде пары двух слов с указателем на информацию для float64 и указателем на значение float64 (3.4).

Те же соображения относятся к s позже в вашей программе.

Существует очень малое неявное преобразование между типами в Go, но переключение между значениями и интерфейсами при вызове функции (или присвоении переменной) является исключением.

+0

СПАСИБО ВАС !! Поскольку я изучаю GO, и я, кажется, нахожу неясные вопросы, на которые я не могу найти ответ. Если во всем, что я изучаю, отсутствует недостающее предположение, оно, кажется, вскакивает и укусит меня. Является ли это значение конверсией интерфейса, упоминаемой где-то конкретно? Если так, мне нравится ссылка на него. Еще один вопрос, я полагаю, что значение преобразования интерфейса выполняется во время компиляции - не время выполнения! Это верно. – Godfather

+0

----------------------- Еще один вопрос: ----------------------- -------------------------- Могу ли я предположить, что значение преобразования интерфейса выполняется во время компиляции - не время выполнения! Это верно? – Godfather

+0

https://golang.org/ref/spec#Calls объясняет, как работают вызовы функций, хотя в нем явно не указано, что происходит, когда у вас есть формальный параметр функции типа интерфейса. Я не знаю, что вы имеете в виду, когда спрашиваете, можно ли предположить, что преобразование значения в интерфейс выполняется во время компиляции. Я не знаю, что это значит сделать конверсию во время компиляции, поэтому я думаю, что это обязательно делается во время выполнения, но я подозреваю, что не понимаю вопроса. –

Смежные вопросы