2015-06-11 4 views
1

У меня есть 2 разных пакеты (PKG1, PKG2), в первом у меня есть код, который вызывает функцию из другого пакетаНеправильного типа отраженной структуры

файл # 1

package pkg1 
import "pkg2" 
import "reflect" 

type User struct { 
    name string 
    ... 
} 

func main() { 
    fmt.Println(reflect.TypeOf((*User)(nil)) //=> *User 
    pkg2.RegisterStruct(reflect.TypeOf((*User)(nil)) 
    //pkg2.RegisterStruct(reflect.TypeOf(&User{}) // also tried this way 
} 

файл # 2

package pkg2 

import "reflect" 

func RegisterStruct(u interface{}) { // also tried to have argument type as reflect.Type 
fmt.Println(u) //=> *reflect.rtype 
} 

Зачем нужен тип reflect.rtype вместо *User? И как правильно передать тип другому pkg?

+2

Код, приведенный здесь, не может производить вывод, который вы говорите. – Wessie

+0

Пожалуйста, прочитайте о создании [mcve] (http://stackoverflow.com/help/mcve) (минимальный, полный и проверяемый пример). Недопустимые фрагменты кода. Когда они редактируются, чтобы скомпилировать их (в основном отсутствующие скобки), операторы «Println» дают мне «* pkg1.User» с Go1.4.2. (Примечание: 'fmt.Printf ("% T% # v \ n ", u, u)' действительно дает '* reflect.rtype & reflect.rtype {...', но это не то, что вы утверждаете, что использовали). –

+0

И либо ожидайте, либо обратитесь к 'reflect.Type' или не передадите его (т. Е. Просто выполните' pkg2.Register ((* User) (nil)) ', если вы не хотите/не ожидаете' отражения .Type'). –

ответ

-1

reflect.TypeOf() возвращает reflect.Type теперь вы делаете две совершенно разные вещи: в первом вызове Println («правильный» один) этот reflect.Type обернута внутри interface{} (во время вызова Println), а во втором («неправильный»), вы обертываете reflect.Type внутри interface{} при вызове RegisterSturct, а затем снова перезаписываете его внутри дополнительного interface{} при вызове Println. Println просто удаляет один слой интерфейса {} - wrapping.

Извините, это вздор. Мне придется подумать немного больше. Удалил бы, если это было возможно.

+1

reflect.Type уже является интерфейсом. В интерфейсе {} '", который происходит во время вызова 'RegisterStruct' или' fmt.Println', и, разумеется, нет двойной обертки. –

+0

Извините, это было слишком быстро. Вторая - это просто копия значения интерфейса, она не переупакована. Удалит. – Volker

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