2015-06-26 3 views
1

Возможно ли в Go для получения отражения. Тип из самой структуры?Получение рефлексии. Тип структуры

псевдо:

type MyStruct struct { 
    Name string 
} 

type := reflect.TypeOf(MyStruct) 

И это можно сделать кусочек этого типа потом?

Update: Я знаю reflect.TypeOf((*t1)(nil)).Elem() решения этой проблемы. Я ищу лучшее решение для этого, так как это кажется мне довольно недружелюбным. Я попытаюсь объяснить ситуацию.

При разработке «родовой» DataService выше модели базы данных, я хочу сделать что-то вроде:

ds := NewDataService(db.Collection("MyStruct"), MyStruct) 

где DataService Умейте найти, вставить и т.д., используя эту модель. Поэтому мне нужно передать структуру, чтобы модель могла использоваться правильно (например, с http-сервером).

Вторая часть необходима, так как Find должен возвращать кусочек найденных объектов.

Потому что я использую Монго, нет ничего подобного схемы доступной в db.Collection

+1

Возможный дубликат [в голанге, можно получить отражение.Тип от самого типа? от имени как строки?] (http://stackoverflow.com/questions/6390585/in-golang-is-is-possible-get-reflect-type-from-the-type-itself-from-name-as-st) –

+0

Я обновил вопрос – Gelidus

ответ

1

Для первой части: это не является дубликатом in golang, is is possible get reflect.Type from the type itself? from name as string?

Для второй части: сделать срез этого типа впоследствии:

Вы можете получить Type разреза, у которого есть тип элементов, который у вас уже есть, с помощью Type.SliceOf(), и вы можете использовать reflect.MakeSlice() функция для создания среза такого типа. Она возвращает Value, вы можете использовать его метод Value.Interface() для получения interface{}, на котором вы можете использовать type assertion если вам нужен результат как тип []MyStruct:

tt := reflect.TypeOf((*MyStruct)(nil)).Elem() 
fmt.Println(tt) 

ms := reflect.MakeSlice(reflect.SliceOf(tt), 10, 20).Interface().([]MyStruct) 
ms[0].Name="test" 
fmt.Println(ms) 

Выход (Go Playground):

main.MyStruct 
[{test} {} {} {} {} {} {} {} {} {}] 
Смежные вопросы