package main
import (
"errors"
"fmt"
"reflect"
"reflectusage/config"
)
func main() {
conf := config.Conf{}
opName := "create"
conf.Op = &opName
conf.Port = 3308
fmt.Printf("conf.Port=%d\n\n", conf.Port)
t := reflect.TypeOf(conf)
v := reflect.ValueOf(conf)
printStructField(&t)
callMethod(&v, "SayOp", []interface{}{" Db"})
getTag(&t, "Op", "json")
getTag(&t, "Op", "xml")
getTag(&t, "nofield", "json")
}
func printStructField(t *reflect.Type) {
fieldNum := (*t).NumField()
for i := 0; i < fieldNum; i++ {
fmt.Printf("conf's field: %s\n", (*t).Field(i).Name)
}
fmt.Println("")
}
func callMethod(v *reflect.Value, method string, params []interface{}) {
f := (*v).MethodByName(method)
if f.IsValid() {
args := make([]reflect.Value, len(params))
for k, param := range params {
args[k] = reflect.ValueOf(param)
}
ret := f.Call(args)
if ret[0].Kind() == reflect.String {
fmt.Printf("%s Called result: %s\n", method, ret[0].String())
}
} else {
fmt.Println("can't call " + method)
}
fmt.Println("")
}
func getTag(t *reflect.Type, field string, tagName string) {
var (
tagVal string
err error
)
fieldVal, ok := (*t).FieldByName(field)
if ok {
tagVal = fieldVal.Tag.Get(tagName)
} else {
err = errors.New("no field named:" + field)
}
fmt.Printf("get struct[%s] tag[%s]: %s, error:%v\n", field, tagName, tagVal, err)
fmt.Println("")
}