package mainimport ( "encoding/json" "fmt")type Student struct { ID int `json:"id"` Gender string `json:"gender"` Name string `json:"name"` Sno string `json:"sno"`}func main() { var s1 = Student{ ID: 1, Gender: "男", Name: "李四", Sno: "s0001", } fmt.Println("aa") var s, _ = json.Marshal(s1) jsonStr := string(s) fmt.Println(jsonStr)}
package mainimport ( "fmt" "reflect")type myInt inttype Person struct { Name string Age int}//反射获取任意变量的类型func reflectFn(x interface{}) { v := reflect.TypeOf(x) fmt.Println(v)}func main() { a := 10 //int b := 23.4 //float64 c := true //bool d := "你好golang" //string reflectFn(a) reflectFn(b) reflectFn(c) reflectFn(d) var e myInt = 34 var f = Person{ Name: "张三", Age: 20, } reflectFn(e) //main.myInt reflectFn(f) //main.Person var h = 25 reflectFn(&h) //*int}
package mainimport ( "fmt" "reflect")type myInt inttype Person struct { Name string Age int}//反射获取任意变量的类型func reflectFn(x interface{}) { v := reflect.TypeOf(x) // v.Name() //类型名称 ,种类(Kind)就是指底层的类型 // v.Kind() //种类 fmt.Printf("类型:%v 类型名称:%v 类型种类:%v \n", v, v.Name(), v.Kind())}func main() { a := 10 //int b := 23.4 //float64 c := true //bool d := "你好golang" //string reflectFn(a) reflectFn(b) reflectFn(c) reflectFn(d) var e myInt = 34 var f = Person{ Name: "张三", Age: 20, } reflectFn(e) //main.myInt reflectFn(f) //main.Person var h = 25 reflectFn(&h) //*int 类型名称: 类型种类:ptr var i = [3]int{1, 2, 3} reflectFn(i) //[3]int 类型名称: 类型种类:array var j = []int{11, 22, 33} reflectFn(j) //[]int 类型名称: 类型种类:slice}
package mainimport ( "fmt" "reflect")func reflectValue(x interface{}) { // var num = 10 + x //(mismatched types int and interface {} // b, _ := x.(int) // var num = 10 + b // fmt.Println(num) //23 //反射来实现这个功能 // v := reflect.ValueOf(x) // fmt.Println(v) //13 // var n = v + 12 // fmt.Println(n) //mismatched types reflect.Value and int //反射获取变量的原始值 v := reflect.ValueOf(x) var m = v.Int() + 12 fmt.Println(m) //25}func main() { var a = 13 reflectValue(a)}
package mainimport ( "fmt" "reflect")func reflectValue(x interface{}) { v := reflect.ValueOf(x) // v.Kind() //获取种类 kind := v.Kind() switch kind { case reflect.Int64: fmt.Printf("int类型的原始值%v,计算后的值是%v \n", v.Int(), v.Int()+10) case reflect.Float32: fmt.Printf("Float32类型的原始值%v\n", v.Float()) case reflect.Float64: fmt.Printf("Float64类型的原始值%v\n", v.Float()) case reflect.String: fmt.Printf("string类型的原始值%v\n", v.String()) default: fmt.Printf("还没有判断这个类型\n") }}func main() { var a int64 = 100 var b float32 = 12.3 var c string = "你好golang" reflectValue(a) reflectValue(b) reflectValue(c)}
package mainimport ( "fmt" "reflect")func reflectSetValue(x interface{}) { // *x = 120 //invalid indirect of x (type interface {}) // v, _ := x.(*int) // *v = 120 // invalid memory address or nil pointer dereferenc v := reflect.ValueOf(x) // fmt.Println(v.Kind()) //ptr // fmt.Println(v.Elem().Kind()) //int64 if v.Elem().Kind() == reflect.Int64 { v.Elem().SetInt(123) } else if v.Elem().Kind() == reflect.String { v.Elem().SetString("你好 go语言") }}func main() { var a int64 = 100 reflectSetValue(&a) fmt.Println(a) var b string = "你好golang" reflectSetValue(&b) fmt.Println(b)}
package mainimport ( "fmt" "reflect")//student结构体type Student struct { Name string `json:"name1" form:"username"` Age int `json:"age"` Score int `json:"score"`}func (s Student) GetInfo() string { var str = fmt.Sprintf("姓名:%v 年龄:%v 成绩:%v", s.Name, s.Age, s.Score) return str}func (s *Student) SetInfo(name string, age int, score int) { s.Name = name s.Age = age s.Score = score}func (s Student) Print() { fmt.Println("这是一个打印方法...")}//打印字段func PrintStructField(s interface{}) { //判断参数是不是结构体类型 t := reflect.TypeOf(s) v := reflect.ValueOf(s) if t.Kind() != reflect.Struct && t.Elem().Kind() != reflect.Struct { fmt.Println("传入的参数不是一个结构体") return } //1、通过类型变量里面的Field可以获取结构体的字段 field0 := t.Field(0) fmt.Printf("%#v \n", field0) //reflect.StructField{Name:"Name", PkgPath:"", Type:(*reflect.rtype)(0x4adf20), Tag:"json:\"name\"", Offset:0x0, Index:[]int{0}, Anonymous:false} fmt.Println("字段名称:", field0.Name) fmt.Println("字段类型:", field0.Type) fmt.Println("字段Tag:", field0.Tag.Get("json")) fmt.Println("字段Tag:", field0.Tag.Get("form")) //2、通过类型变量里面的FieldByName可以获取结构体的字段 fmt.Println("----------------------") field1, ok := t.FieldByName("Age") if ok { fmt.Println("字段名称:", field1.Name) fmt.Println("字段类型:", field1.Type) fmt.Println("字段Tag:", field1.Tag.Get("json")) } //3、通过类型变量里面的NumField获取到该结构体有几个字段 var fieldCount = t.NumField() fmt.Println("结构体有", fieldCount, "个属性") //4、通过值变量获取结构体属性对应的值 fmt.Println(v.FieldByName("Name")) fmt.Println(v.FieldByName("Age")) fmt.Println("----------------------") for i := 0; i < fieldCount; i++ { fmt.Printf("属性名称:%v 属性值:%v 属性类型:%v 属性Tag:%v\n", t.Field(i).Name, v.Field(i), t.Field(i).Type, t.Field(i).Tag.Get("json")) }}//打印执行方法func PrintStructFn(s interface{}) { t := reflect.TypeOf(s) v := reflect.ValueOf(s) if t.Kind() != reflect.Struct && t.Elem().Kind() != reflect.Struct { fmt.Println("传入的参数不是一个结构体") return } //1、通过类型变量里面的Method可以获取结构体的方法 method0 := t.Method(0) //和结构体方法的顺序没有关系,和结构体方法的ASCII有关系 fmt.Println(method0.Name) //GetInfo fmt.Println(method0.Type) //func(main.Student) string fmt.Println("--------------------------") //2、通过类型变量获取这个结构体有多少个方法 method1, ok := t.MethodByName("Print") if ok { fmt.Println(method1.Name) //Print fmt.Println(method1.Type) //func(main.Student) } fmt.Println("--------------------------") //3、通过《值变量》执行方法 (注意需要使用值变量,并且要注意参数) v.Method(0).Call(nil) 或者v.MethodByName("Print").Call(nil) // v.Method(1).Call(nil) v.MethodByName("Print").Call(nil) info1 := v.MethodByName("GetInfo").Call(nil) fmt.Println(info1) //4、执行方法传入参数 (注意需要使用《值变量》,并且要注意参数,接收的参数是[]reflect.Value的切片) var params []reflect.Value params = append(params, reflect.ValueOf("李四")) params = append(params, reflect.ValueOf(23)) params = append(params, reflect.ValueOf(99)) v.MethodByName("SetInfo").Call(params) //执行方法传入参数 info2 := v.MethodByName("GetInfo").Call(nil) fmt.Println(info2) // 5、获取方法数量 fmt.Println("方法数量:", t.NumMethod())}func main() { stu1 := Student{ Name: "小明", Age: 15, Score: 98, } // PrintStructField(stu1) PrintStructFn(&stu1) fmt.Printf("%#v\n", stu1)}
package mainimport ( "fmt" "reflect")//student结构体type Student struct { Name string `json:"name"` Age int `json:"age"` Score int `json:"score"`}func (s Student) GetInfo() string { var str = fmt.Sprintf("姓名:%v 年龄:%v 成绩:%v", s.Name, s.Age, s.Score) return str}//反射修改结构体属性func reflectChangeStruct(s interface{}) { t := reflect.TypeOf(s) v := reflect.ValueOf(s) if t.Kind() != reflect.Ptr { fmt.Println("传入的不是结构体指针类型") return } else if t.Elem().Kind() != reflect.Struct { fmt.Println("传入的不是结构体指针类型") return } //修改结构体属性的值 name := v.Elem().FieldByName("Name") name.SetString("小李") age := v.Elem().FieldByName("Age") age.SetInt(22)}func main() { stu1 := Student{ Name: "小明", Age: 15, Score: 98, } // PrintStructField(stu1) reflectChangeStruct(&stu1) fmt.Printf("%#v\n", stu1) //main.Student{Name:"小李", Age:22, Score:98}}