go 반사 획득 유형 대상과 값, go 반사 획득 바늘 이름과 유형, golang 반사 대상의 빈 값 처리, golang 반사 값 대상 수정 변수의 값
1. 반사 획득 유형 대상과 값
package main
import (
"fmt"
"reflect"
)
func main() {
a := 36
atype := reflect.TypeOf(a)
fmt.Println(atype.Name()) // int
avalue := reflect.ValueOf(a)
fmt.Println(avalue.Int()) //
}
2. 반사 획득 구조체 유형 이름과 유형
package main
import (
"fmt"
"reflect"
)
type myobject struct {
Name string
Sex int
Age int `json:"age"`
}
func main() {
typeof := reflect.TypeOf(myobject{
})
fmt.Println(typeof.Name()) // myobject
fmt.Println(typeof.Kind()) // myobject
}
3. 반사 획득 포인터 이름과 유형
package main
import (
"fmt"
"reflect"
)
type myobject struct {
Name string
Sex int
Age int `json:"age"`
}
func main() {
typeof := reflect.TypeOf(&myobject{
})
fmt.Println(typeof.Elem().Name()) //
fmt.Println(typeof.Elem().Kind()) //
}
4. 반사 획득 구조체 구성원의 유형
package main
import (
"fmt"
"reflect"
)
type myobject struct {
Name string
Sex int
Age int `json:"age"`
}
func main() {
typeof := reflect.TypeOf(myobject{
})
fieldnum := typeof.NumField() //
for i := 0; i < fieldnum; i++ {
fieldname := typeof.Field(i) //
fmt.Println(fieldname)
name, err := typeofmystruct.FieldByName("Name")//
fmt.Println(name, err)
}
}
5. 반사값 대상은 임의의 값을 얻는다
package main
import (
"fmt"
"reflect"
)
func main() {
a := 2020
valof := reflect.ValueOf(a) // reflect.ValueOf
fmt.Println(valof)
//
fmt.Println(valof.Interface()) // interface{}
fmt.Println(valof.Int()) // int
}
참고:
.Interface() interface{} 。 , .Int()、.Uint() 、.Floact() 、.Bool() 、.Bytes() 、.String()。
6. 반사로 구조체의 구성원 필드의 값을 얻는다
package main
import (
"fmt"
"reflect"
)
type myobject struct {
Name string
Age int
}
func main() {
h := myobject{
" ", 20}
fmt.Println(h)
hofvalue := reflect.ValueOf(h) // reflect.Value 。
for i := 0; i < hofvalue.NumField(); i++ {
//
// i
fmt.Println(hofvalue.Field(i).Interface())
}
fmt.Println(hofvalue.Field(1).Type()) // 1
}
7. 반사 대상의 빈값 처리
package main
import (
"fmt"
"reflect"
)
func main() {
var a *int // a nil
fmt.Println(reflect.ValueOf(a).IsNil()) // nil true
// reflect.Value , nil IsValid() false
fmt.Println(reflect.ValueOf(nil).IsValid())
}
8. 반사값 대상은 변수의 값을 수정한다
package main
import (
"fmt"
"reflect"
)
func main() {
// a
a := 100
fmt.Printf("a :%p
", &a)
// a reflect.Value
rf := reflect.ValueOf(&a)
fmt.Println(" a :", rf)
// a
rval := rf.Elem()
fmt.Println(" a :", rval)
// a
rval.SetInt(200)
fmt.Println(" :", rval.Int())
//
fmt.Println(" a :", a)
}
: SetInt(x) x, int 。
SetUint(x) x, uint 。
SetFloat(x) x, float32 float64 。
SetBool(x) x, bool 。
SetBytes(x) x, []Byte 。
SetString(x) x, string 。
9. 반사 호출 함수 방법
package main
import (
"fmt"
"reflect"
)
func myfunc(a, b int) int {
return a + b
}
func main() {
r_func := reflect.ValueOf(myfunc)
//
params := []reflect.Value{
reflect.ValueOf(10), reflect.ValueOf(20)}
//
res := r_func.Call(params)
//
fmt.Println(res[0].Int())
}