> 백엔드 개발 > Golang > Go 언어로 반사의 기본을 가르치는 기사

Go 언어로 반사의 기본을 가르치는 기사

풀어 주다: 2023-07-25 17:01:58
앞으로
1439명이 탐색했습니다.

반사란 무엇인가

반사, 음... 역전, 즉 뒤집는다는 뜻이에요.

예를 들어 이런 아주 간단한 코드가 있습니다.

var a int = 3
fmt.Println(a)
로그인 후 복사

물론이죠 a a变量是int类型,但是反过来想,程序是怎么知道aint변수는 int </ code><br/></p> 유형이지만 반대로 생각해보면 프로그램이 <p cid="n11" mdtype="paragraph" style="line-height: inherit;orphans: 4;margin-top: 0.8em;margin-bottom: 0.8em;white-space: pre-wrap;font-family: "Open Sans", "Clear Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;font-size: 16px;text-align: start;"><span md-inline="plain"><code style="font-family: var(--monospace);vertical-align:initial;border-width:를 어떻게 알 수 있습니까? 1px;테두리 스타일: 단색;테두리 색상: rgb(231, 234, 237);배경 색상: rgb(243, 244, 244);테두리 반경: 3px;패딩 오른쪽: 2px;패딩 왼쪽: 2px;글꼴 크기: 0.9 em;">a

is

int

유형은 어떻습니까? ? ?

이때 리플렉션을 이용해야 합니다.

Go 언어로 반사의 기본을 가르치는 기사샘플 코드

🎜🎜
v := reflect.TypeOf(a)
fmt.Println(v)
로그인 후 복사
🎜🎜🎜두 개의 코드가 합쳐져 ​​하나의 실행 결과가 됩니다🎜🎜🎜🎜🎜🎜

두 번째 코드 줄은 변수 aa还原出了int类型。

什么???你为我有什么用???,嗯。。。实话实说,用的不是太多,但是必须要会的。


反射(reflect包)

在Go中,任何变量,都有具体类型具体值,就像var a int = 3具体类型就是int具体值就是3restoredint

🎜 유형입니다. 🎜
🎜

🎜뭐? ? ? 당신은 나에게 무슨 소용이 있습니까? ? ? ,음. . . 솔직히 별로 안쓰는데 어떻게 해야하는지 알아야겠네요. 🎜🎜

🎜
🎜🎜

🎜Reflection(패키지 반영)🎜

🎜Go에서는 모든 변수에 🎜특정 유형🎜🎜 및 🎜특정 값🎜🎜(예: 🎜🎜var a int = 3🎜🎜, 🎜특정 유형 🎜🎜은 🎜🎜int</code >🎜🎜, 🎜<span md-inline="strong"><strong>특정 값</strong>🎜🎜은 🎜🎜<code style="font-family: var(--monospace);vertical-align: 초기 ;border-width입니다. : 1px;테두리 스타일: 단색;테두리 색상: rgb(231, 234, 237);배경 색상: rgb(243, 244, 244);테두리 반경: 3px;패딩 오른쪽: 2px ;패딩 왼쪽 : 2px;글꼴 크기: 0.9em;">3🎜🎜. 🎜🎜

따라서 변수의 특정 유형 reflect.Typereflect.Type,变量的具体值归属在reflect.Value

并且Go的提供了

  • reflect.TypeOf获取具体类型

  • reflect.ValueOf获取具体值

TypeOf

TypeOf, 변수의 특정 값 reflect.Value

.

And Go는 🎜🎜
  • < p cid ="n24" mdtype="paragraph" style="line-height: 상속;orphans: 4;margin-bottom: 0.5rem;white-space: pre-wrap;">🎜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)
}
로그인 후 복사

执行结果

Go 언어로 반사의 기본을 가르치는 기사

通过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)
}
로그인 후 복사

执行结果

Go 언어로 반사의 기본을 가르치는 기사

总结

经过对比,会发现几个特殊问题。

如果变量是指针类型Name为空,Kindptr

변수가 참조 유형(슬라이스 및 맵) 유형인 경우 이름Name为空,只有Kind

如果变量是结构体Name是结构体名,Kindstruct

ValueOf

TypeOf은 비어 있으며 종류.

변수가 구조인 경우 ,

이름🎜🎜 구조 이름은 🎜🎜종류🎜🎜 예 🎜🎜구조🎜🎜. 🎜🎜

🎜ValueOf🎜

🎜유형🎜🎜만 변수의 🎜🎜🎜특정 유형🎜🎜🎜을 차례로 얻을 수 있지만, 🎜🎜🎜특정 값🎜🎜🎜을 얻을 수 없다는 점이 조금 불친절합니다. 🎜🎜

所以ValueOf就来解决这个问题了,但是ValueOf牛叉的是,它里面还包括了变量类型

注:ValueOfTypeOfKind属性返回内容是一摸一样的。

需求:定义一个函数,可以接收任意类型,通过反射得出变量类型和变量值。

函数

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)
}
로그인 후 복사

执行结果

Go 언어로 반사의 기본을 가르치는 기사

通过反射设置值

反射还有一个用途,就是动态的修改变量值,可能你暂时体会不到,但是语法还是要学的。

通过反射设置值,需要用到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)
}
로그인 후 복사

执行结果

Go 언어로 반사의 기본을 가르치는 기사

总结

上述我们school习了Go基础反射的TypeOfTypeOfTypeOf的Name和KindValueOf通过反射设置值

其中KindTypeValueOf中都有,通常情况下TypeOfValueOf유형의 이름과 종류

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:Go语言进阶学习
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿