2016-04-27 6 views
4

У меня есть ломтик interface{}, и мне нужно проверить, содержит ли этот срез значения полей указателя.В Go, как я могу проверить значение типа (любого) указателя?

Разъяснение Пример:

var str *string 
s := "foo" 
str = &s 
var parms = []interface{}{"a",1233,"b",str} 
index := getPointerIndex(parms) 
fmt.Println(index) // should print 3 
+0

'* str' будет разыменовывать указатель и будет иметь тип« string »nonpointer. Вы хотели поставить 'str' в литеральную часть? – icza

+0

yep, не заметил, отредактировал. – Elad

ответ

5

Вы можете использовать отражение (reflect пакет), чтобы проверить, является ли значение типа указателя.

func firstPointerIdx(s []interface{}) int { 
    for i, v := range s { 
     if reflect.ValueOf(v).Kind() == reflect.Ptr { 
      return i 
     } 
    } 
    return -1 
} 

Следует отметить, что приведенный выше код проверяет тип значения, который «обернутой» в interface{} (это тип элемента параметра s среза). Это означает, что если вы передаете кусочек, как это:

s := []interface{}{"2", nil, (*string)(nil)} 

Это будет возвращать 2, потому что даже если третий элемент является nil указателем, он по-прежнему является указатель (завернутый в не значении nil интерфейса).

+0

Именно то, что я искал, спасибо! – Elad

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

  • Нет связанных вопросов^_^