2016-04-27 134 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'將取消引用指針,它將是非指針'字符串'類型。你的意思是把'str'放入切片文字中嗎? – icza

+0

是的,沒有注意到,編輯。 – 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