Go语言中的反射非常强大,可以对string, int, struct, func...进行反射,使用起来也比较简单。
示例1:反射函数
package main import ( "fmt" "reflect" ) func Hello() { fmt.Println("hello world!") } func main() { valueOf := reflect.ValueOf(Hello) valueOf.Call(nil) }
示例2:反射带参数的函数
package main import ( "fmt" "reflect" ) func Print(str ...string) { fmt.Println("str=", str) } func main() { valueOf := reflect.ValueOf(Print) i := make([]reflect.Value, 3) i[0] = reflect.ValueOf("1") i[1] = reflect.ValueOf("2") i[2] = reflect.ValueOf("3") valueOf.Call(i) }
示例3: 结构体反射,实现Struct to Json的转换
package main import ( "reflect" "fmt" ) type User struct { Name string `json:"name"` Age int Sex string } func TestType(a interface{}) { typeOf := reflect.TypeOf(a) fmt.Printf("typeof = %v ", typeOf) kind := typeOf.Kind() switch kind { case reflect.Int: fmt.Println("a is an int") case reflect.String: fmt.Println("a is a string") } } func TestValue(a interface{}) { valueOf := reflect.ValueOf(a) switch valueOf.Kind() { case reflect.Ptr: i := valueOf.Elem().Type() switch i.Kind() { case reflect.Int: valueOf.Elem().SetInt(10000) case reflect.String: valueOf.Elem().SetString("hello world") } } } func Marshal(a interface{}) { valueOf := reflect.ValueOf(a) typeOf := valueOf.Type() jsonStr := "" switch typeOf.Kind() { case reflect.Struct: numField := typeOf.NumField() for i:=0; i<numField; i++ { structField := typeOf.Field(i) valueField := valueOf.Field(i) name := structField.Name if structField.Tag.Get("json") != "" { name = structField.Tag.Get("json") } if valueField.Type().Kind() == reflect.String { jsonStr += fmt.Sprintf(" "%s": "%v"", name, valueField.Interface()) } else { jsonStr += fmt.Sprintf(" "%s": %v", name, valueField.Interface()) } if numField - i > 1 { jsonStr += ", " } } jsonStr = "{ " + jsonStr + " }" } fmt.Printf("%s", jsonStr) } func main() { var a int TestType(a) var b string TestType(b) TestValue(&a) TestValue(&b) fmt.Println(a, b) var user User user.Name = "alex" user.Age = 100 user.Sex = "man" Marshal(user) }
参考文章:https://studygolang.com/articles/896