reflect.Indirect 를 활용하면, interface 로 전달된 인자가 pointer인 경우, 그 pointer가 가르키는 실제 type 에 대한 정보를 알수 있다. 여러 type을 전달받는 공통 함수 등을 작성할때 유용한 tip
package main
import (
"fmt"
"reflect"
)
func testFunc(value interface{}) {
fmt.Println("---------------------")
fmt.Println("type = " + reflect.ValueOf(value).Type().String())
fmt.Println("kind = " + reflect.ValueOf(value).Kind().String())
if reflect.ValueOf(value).Kind()==reflect.Ptr {
fmt.Println("--> pointer " )
pointsToValue := reflect.Indirect( reflect.ValueOf(value))
fmt.Println("-->",pointsToValue.Kind(),
" - ",pointsToValue.Type(), " - ", pointsToValue)
if pointsToValue.Kind()==reflect.Slice {
fmt.Println("--> slice !! " )
}
}
}
func main() {
var testVar1 string
var testVar2 []string
var testVar3 []*string
testVar2 = append(testVar2,"A")
testVar2 = append(testVar2,"B")
testFunc(testVar1)
testFunc(&testVar1)
testFunc(testVar2)
testFunc(&testVar2)
testFunc(testVar3)
testFunc(&testVar3)
}