Go의 reflect 패키지 주파수 함수

15156 단어 Gogolangreflecttech

TypeOf(interface{}) reflect.Type


매개 변수에서 주어진 값의 유형 정보를 얻습니다.결과는 타입의 인터페이스형으로, 타입을 활용해 원형을 참조하는 방법, 요소정보, 포장경로 등 유형과 관련된 다양한 정보를 참조할 수 있습니다.※모든 타입의 Type 방법을 다 이용할 수 있는 것은 아니므로 Type 보유 방법을 사용하기 전에 Kind() 함수로 타입의 종류를 조사하십시오.
type MyStruct struct {
	Id   string
	Code int
}

m := new(MyStruct)

rt := reflect.TypeOf(m)
fmt.Println(rt) // *main.MyStruct

Kind() reflect.Kind


Type이 가지고 있는 방법 중 하나입니다.TypeOf 등을 통해 얻은 Type이 어떤 원시형에 속하는지 재검증한다.
type MyStruct struct {
	Id   string
	Code int
}

m := new(MyStruct)
rt := reflect.TypeOf(m)
kind := rt.Kind()
fmt.Println(kind) // ptr

m2 := MyStruct{}
rt2 := reflect.TypeOf(m2)
kind2 := rt2.Kind()
fmt.Println(kind2) // struct

type MyMyStruct MyStruct

m3 := MyMyStruct{}
rt3 := reflect.TypeOf(m3)
kind3 := rt3.Kind()
fmt.Println(kind3) // struct
Kind 함수는 Kind형을 되돌려줍니다. Kind형에 대해 다음과 같이 uint의 값과 관련된 상수를 설정합니다.
ValueOf 등에서 받은 reflect값을 반환하는 동작이 같은 Value에서도 사용할 수 있습니다.
type Kind uint

const (
	Invalid Kind = iota
	Bool
	Int
	Int8
	Int16
	(略)
	Ptr
	Slice
	String
	Struct
	UnsafePointer
)
TypeOf 등을 통해 얻은 것의 원시형이 목적형과 일치하는지 등을 검증할 때 Kind 함수로 얻은 값을 상기 상수와 비교한다.
type MyStruct struct {
	Id   string
	Code int
}

m := new(MyStruct)
rt := reflect.TypeOf(m)
kind := rt.Kind()
fmt.Println(kind == reflect.Array)  // false
fmt.Println(kind == reflect.Struct) // false
fmt.Println(kind == reflect.Ptr)    // true

(Type) Elem() reflect.Type


Type이 가지고 있는 방법 중 하나입니다.typeOf 등을 통해 얻은 타입의 (※) 요소형을 획득합니다.
※ 요소형···배열, 채널, 맵, 지침, 슬라이드에 저장된 요소의 유형
Type의 Kind는 진열, 채널, 맵, 포인터, 슬라이드 이외의 상황에서panic를 일으킨다.
ValueOf 등에서 받은 reflectValue에서도 같은 이름의 함수를 사용할 수 있지만 반환 값은 모델 이름이 아닌 값입니다.
type MyStruct struct {
	Id   string
	Code int
}

m := new(MyStruct)
rt := reflect.TypeOf(m)
fmt.Println(rt.Kind()) // ptr
elem := rt.Elem()
fmt.Println(elem) // main.MyStruct

strSlice := []string{"hogehoge"}
rt2 := reflect.TypeOf(strSlice)
fmt.Println(rt2.Kind()) // slice
elem2 := rt2.Elem()
fmt.Println(elem2) // string

str := "hogehoge"
rt3 := reflect.TypeOf(str)
fmt.Println(rt3.Kind()) // string
elem3 := rt3.Elem()
fmt.Println(elem3) // panic: reflect: Elem of invalid type string

ValueOf(interface{}) reflect.Value


매개변수에 지정된 값을 Value 유형으로 초기화하는 값을 가져옵니다.
밸류에도 Kind 방법이 있는데, 밸류오프가 반환한 값은 원래 값의 Kind를 유지한다.
type MyStruct struct {
	Id   string
	Code int
}

m := &MyStruct{Id: "id01", Code: 1}
rv := reflect.ValueOf(m)
fmt.Printf("type: %T, value: %v\n", rv, rv) // type: reflect.Value, value: &{id01 1}
fmt.Println(rv.Kind()) // ptr

str := "hoge"
rv2 := reflect.ValueOf(str)
fmt.Printf("type: %T, value: %v\n", rv2, rv2) // type: reflect.Value, value: hoge
fmt.Println(rv2.Kind()) // string

(Value) Indirect(reflect.Value) reflect.Value


ValueOf 등에서 받은 reflectValue의 솔리드 값을 참조합니다.PTr이어야 합니다.
type MyStruct struct {
	Id   string
	Code int
}

m := &MyStruct{Id: "id01", Code: 1}
rv := reflect.ValueOf(m)
indirect := reflect.Indirect(rv)
fmt.Println(indirect) // {id01 1}

(Value) Set(reflect.Value)


매개변수에 의해 입력된 값을 수신기에 대입하는 Value 방법입니다.
CanSet 함수를 통해 대입할 수 있는지 사전에 확인합니다.
type MyStruct struct {
	Id   string
	Code int
}

target := new(MyStruct)

rvTarget := reflect.ValueOf(target)
indirect := reflect.Indirect(rvTarget)
fmt.Println(target) // &{ 0}

m := MyStruct{Id: "id01", Code: 1}
rvm := reflect.ValueOf(m)
indirect.Set(rvm)

fmt.Println(target) // &{id01 1}

좋은 웹페이지 즐겨찾기