反射
反射
可以在运行时动态的获取变量的相关信息
Import("reflect")
reflect.TypeOf,获取变量的类型,返回reflect.Type类型
reflect.ValueOf,获取变量的类型,返回reflect.Value类型
reflect.Value.Kind,获取变量的类别,返回一个常量
reflect.Value.Interface(),转换成interface{}类型
import (
"fmt"
"reflect"
)
func test(i interface{}) {
t := reflect.TypeOf(i)
fmt.Println(t)
}
func main() {
var i int
test(i)
}
func test(i interface{}) {
t := reflect.TypeOf(i)
fmt.Println(t)
of := reflect.ValueOf(i)
k := of.Kind()
fmt.Println(k)
i2 := of.Interface()
i3 := i2.(int)
fmt.Println(i3)
}
-
-
reflect.Value.SetFloat(),设置浮点数
-
reflect.Value.SetInt(),设置整数
-
reflect.Value.SetString(),设置字符串
// 使用Elem()相当于指针前面带了一个*
func test(i interface{}) {
val := reflect.ValueOf(i)
val.Elem().SetInt(100)
fmt.Println(val.Elem())
}
func main() {
var i int
test(&i) // 这里传指针,否则值类型传的是副本,修改值会报错
}
type Student struct {
Name string
Age int
Score float64
}
func main() {
var stu = Student{
Name: "Eric",
Age: 14,
Score: 45.6,
}
test2(stu)
}
func test2(b interface{}) {
val := reflect.ValueOf(b)
kd := val.Kind()
if kd != reflect.Struct {
fmt.Printf("you kind is %T", kd)
return
}
field := val.NumField()
fmt.Println(field)
method := val.NumMethod()
fmt.Println(method)
}
reflect.Value.Method(n).Call(val []Value) 来调用结构体中的方法,n是第几个方法
reflect.Value.Field(n),n表示第几个字段
type Student struct {
Name string
Age int
Score float64
}
func (s Student) Print() {
fmt.Println("---- START ----")
fmt.Println(s)
fmt.Println("---- END ----")
}
func main() {
var stu = Student{
Name: "Eric",
Age: 15,
Score: 4.5,
}
var val []reflect.Value
reflect.ValueOf(stu).Method(0).Call(val)
// 获取字段
fmt.Println(reflect.ValueOf(stu).Field(0))
// 修改值,需要传入结构体指针,因为结构体是值类型,然后使用Elem()获取指针指向的值
reflect.ValueOf(&stu).Elem().Field(0).SetString("Jin")
fmt.Println(reflect.ValueOf(stu).Field(0))
}
在json格式化的时候,我们可以给结构体定义一个别名用于序列化
type Student struct {
Name string `json:"student_name"`
Age int
Score float64
}
func main() {
var stu = Student{
Name: "Eric",
Age: 10,
Score: 14.5,
}
bytes, _ := json.Marshal(stu)
fmt.Println(string(bytes))
}
那么json包里面是如何获取这个tag的呢?
通过反射就可以获取
type Student struct {
Name string `json:"student_name"`
Age int
Score float64
}
func main() {
var stu = Student{
Name: "Eric",
Age: 10,
Score: 14.5,
}
// 通过反射获取Tag
get := reflect.TypeOf(stu).Field(0).Tag.Get("json")
fmt.Println(get)
}

浙公网安备 33010602011771号