반사, 음... 역전, 즉 뒤집는다는 뜻이에요.
예를 들어 이런 아주 간단한 코드가 있습니다.
var a int = 3 fmt.Println(a)
물론이죠 a
a
变量是int
类型,但是反过来想,程序是怎么知道a
是int
변수는 int code><br>
a
int
이때 리플렉션을 이용해야 합니다.
샘플 코드
🎜🎜v := reflect.TypeOf(a) fmt.Println(v)🎜🎜🎜두 개의 코드가 합쳐져 하나의 실행 결과가 됩니다🎜🎜🎜🎜🎜🎜
두 번째 코드 줄은 변수 a
a
还原出了int
类型。
什么???你为我有什么用???,嗯。。。实话实说,用的不是太多,但是必须要会的。
在Go中,任何变量,都有具体类型和具体值,就像var a int = 3
,具体类型就是int
,具体值就是3
restoredint
🎜뭐? ? ? 당신은 나에게 무슨 소용이 있습니까? ? ? ,음. . . 솔직히 별로 안쓰는데 어떻게 해야하는지 알아야겠네요. 🎜🎜
🎜
🎜🎜
🎜Go에서는 모든 변수에 🎜특정 유형이 있습니다. Strong>🎜🎜 및 🎜특정 값🎜🎜(예: 🎜🎜 따라서 변수의 특정 유형 은 并且Go的提供了 . 🎜 🎜 通过 这个是啥意思呢??这个在结构体中比较好体现。 简答来说就是 经过对比,会发现几个特殊问题。 如果变量是指针类型, 변수가 참조 유형(슬라이스 및 맵) 유형인 경우 如果变量是结构体, 변수가 구조인 경우 , 🎜 所以 注: 需求:定义一个函数,可以接收任意类型,通过反射得出变量类型和变量值。 反射还有一个用途,就是动态的修改变量值,可能你暂时体会不到,但是语法还是要学的。 通过反射设置值,需要用到 示例代码 上述我们school习了Go基础反射的 其中 ,var a int = 3
🎜🎜, 🎜특정 유형 🎜🎜은 🎜🎜int
🎜🎜, 🎜특정 값🎜🎜은 🎜🎜3
🎜🎜. 🎜🎜reflect.Type
reflect.Type
,变量的具体值归属在reflect.Value
。
reflect.TypeOf
获取具体类型。reflect.ValueOf
获取具体值。TypeOf
TypeOf
, 변수의 특정 값 은 reflect.Value
reflect.TypeOf
🎜🎜🎜🎜🎜특정 유형🎜🎜🎜을 가져옵니다. 🎜🎜reflect.ValueOf
🎜🎜get🎜 🎜🎜특정 값🎜🎜🎜. 🎜🎜🎜TypeOf🎜
TypeOf
🎜🎜 메소드는 변수의 🎜🎜🎜특정 유형🎜🎜🎜을 가져올 수 있습니다. 🎜🎜🎜🎜어떤 종류의 데이터라도 받아서 리플렉션을 통해 변수 종류를 출력할 수 있는 함수를 정의해야 합니다. 🎜🎜示例代码
函数
func reflectType(x interface{}) {
v := reflect.TypeOf(x)
fmt.Printf("你传入的变量类型是:%v\n",v)
}
main
func main() {
var a int = 666
var b float64 = 3.14
var c string = "hello world"
var d [3]int = [3]int{1,2,6}
var e []int = []int{1,2,6,88}
var f map[string]interface{} = map[string]interface{}{
"Name":"张三",
"Age":18,
}
reflectType(a)
reflectType(b)
reflectType(c)
reflectType(d)
reflectType(e)
reflectType(f)
}
执行结果
reflect.TypeOf
方法,完美解决上述需求。TypeOf 的Name和Kind
TypeOf
返回的太笼统了,还有更加细化的类型,通过这俩属性获取。示例代码
函数
func reflectType(x interface{}) {
v := reflect.TypeOf(x)
fmt.Printf("你传入的变量类型是:%v | Name:%v | Kind:%v\n", v, v.Name(), v.Kind())
}
结构体
type Student struct {
Name string
Age int
}
main
func main() {
var a int
var b *int
var c []int
var d map[string]interface{}
var e Student
reflectType(a)
reflectType(b)
reflectType(c)
reflectType(d)
reflectType(e)
}
执行结果
总结
Name
为空,Kind
是ptr
。이름
Name
为空,只有Kind
。Name
是结构体名,Kind
是struct
。ValueOf
TypeOf
은 비어 있으며 종류
. 이름
🎜🎜 구조 이름은 🎜🎜종류
🎜🎜 예 🎜🎜구조
🎜🎜. 🎜🎜🎜ValueOf🎜
유형
🎜🎜만 변수의 🎜🎜🎜특정 유형🎜🎜🎜을 차례로 얻을 수 있지만, 🎜🎜🎜특정 값🎜🎜🎜을 얻을 수 없다는 점이 조금 불친절합니다. 🎜🎜ValueOf
就来解决这个问题了,但是ValueOf
牛叉的是,它里面还包括了变量类型。ValueOf
和TypeOf
的Kind
属性返回内容是一摸一样的。函数
func reflectType(x interface{}) {
v := reflect.ValueOf(x)
k := v.Kind()
switch k {
case reflect.Int:
fmt.Printf("我是Int类型,我的值是%v\n",v.Int())
case reflect.Slice:
fmt.Printf("我是切片类型,我的值是%v\n",v.Slice(1,2))
case reflect.Map:
fmt.Printf("我是切片类型,我的值是%v\n",v.MapKeys())
//case :可以继续case下去
}
}
main
func main() {
var a int = 1
var c []int = []int{1, 5, 7, 19}
var d map[string]interface{} = map[string]interface{}{
"Name": "你好",
"Age": 18,
}
var e Student
reflectType(a)
reflectType(c)
reflectType(d)
reflectType(e)
}
执行结果
通过反射设置值
Elem
方法,并且传入的必须是指针。函数
func reflectSetValue(x interface{}) {
v := reflect.ValueOf(x)
//kind也必须是Elem调用
var k = v.Elem().Kind()
switch k {
case reflect.Int:
//反射修改必须通过Elem
v.Elem().SetInt(200)
}
}
main
func main() {
var a int = 10
fmt.Printf("a的值:%v\n", a)
//反射修改值传入的必须是地址
reflectSetValue(&a)
fmt.Printf("a的值:%v\n", a)
}
执行结果
总结
TypeOf
TypeOf
,TypeOf的Name和Kind
,ValueOf
,通过反射设置值
。Kind
在Type
和ValueOf
中都有,通常情况下TypeOf
和ValueOf
,유형의 이름과 종류
ValueOf
일반적으로 반작용;고아: 4;margin-top: 0.8em;margin-bottom: 0.8 em;white-space: pre-wrap;font-family: "Open Sans", "Clear Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;font-size: 16px;text-align: start;" >🎜其中🎜🎜<code style="font-family: var(--monospace);vertical-align: 초기;border-width: 1px;border-style: solid;border-color: rgb(231, 234, 237 );배경색: rgb(243, 244, 244);테두리 반경: 3px;패딩 오른쪽: 2px;패딩 왼쪽: 2px;글꼴 크기: 0.9em;">종류
🎜🎜재 🎜🎜유형
🎜🎜和🎜🎜ValueOf🎜🎜中書有,통常情况下🎜🎜TypeOf
🎜🎜和🎜🎜ValueOf🎜🎜一起使用效果更佳!🎜 🎜🎜🎜反射这一块,可能不是那么好理解,一定要多下功夫!坚持!!🎜🎜
위 내용은 Go 언어로 반사의 기본을 가르치는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!