Go의 reflect 패키지 주파수 함수
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}
Reference
이 문제에 관하여(Go의 reflect 패키지 주파수 함수), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/lken/articles/36073ec89ff0ca텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)