2014-01-27 2 views
3

В Go, reflect.SliceOf() делает тип, представляющий собой кусочек данного типа:В Go, что является обратным отражению.SliceOf()?

SliceOf возвращает тип среза с типом элемента т. Например, если t представляет int, SliceOf (t) представляет [] int.

Однако, у меня уже есть тип для []int, но хочу, чтобы получить тип для int. Есть ли простой способ сделать это? (Обратите внимание, что я использую в качестве примера int. На самом деле, все, что я знаю, у меня есть кусочек, и мне нужно найти, какой тип каждого элемента среза есть.)

Я пытаюсь заполнить кусочек BOOL, INT, поплавка, или строки, с помощью отражения []string ... вот соответствующая часть:

numElems := len(req.Form["keyName"]) 
if structField.Kind() == reflect.Slice && numElems > 0 { 
    slice := reflect.MakeSlice(structField.Type(), numElems, numElems) 
    for i := 0; i < numElems; i++ { 
     // I have some other code here to fill out the slice 
    } 
} 

Но для того, чтобы заполнить срез, мне нужно знать тип среза I заполнение ...

ответ

4

В вашем случае у вас уже есть тип элемента: structField.Type(). Вы можете использовать reflect.New(t).Elem(), чтобы получить «редактируемый» тип reflect.Value. После того, как вы заполнили это значение, вы можете позвонить slice.Index(i).Set(...), чтобы назначить это значение в результирующий фрагмент.

Чтобы ответить на письмо вашего вопроса, хотя, если у вас есть кусочек и нужно заполнить его, скажем, у вас есть reflect.Type из []int, то вы можете позвонить .Elem() получить reflect.Type для int.

См. Документацию Type для методов, которые вы можете вызвать по типу.

+0

Bingo! '.Elem()' сделал трюк. Этот магический метод делает всевозможные вещи. Спасибо за подробное объяснение. Это делается в отношении [martini-contrib/binding] (https://github.com/codegangsta/martini-contrib/tree/master/binding), поэтому я надеюсь, что ваш ответ принесет пользу многим людям. – Matt

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