>  기사  >  백엔드 개발  >  golang에서 반사가 중요합니까?

golang에서 반사가 중요합니까?

(*-*)浩
(*-*)浩원래의
2019-12-03 13:37:412921검색

golang에서 반사가 중요합니까?

Golang은 런타임에 변수를 업데이트하고, 값을 보고, 메소드를 호출하고, 컴파일 타임에 유형을 알지 못한 채 직접 수행하는 메커니즘을 제공합니다. 레이아웃을 조작하는 것을 리플렉션이라고 합니다.

왜 리플렉션을 사용하나요? #推荐#(추천 학습:go)#🎜🎜 ## 🎜🎜#예를 들어 때로는 다양한 유형의 값을 처리하는 함수가 필요할 때가 있습니다. 유형을 모르고 다음과 같이 쓸 수도 있습니다.

// 伪代码
switch value := value.(type) {
case string:
    // ...一些操作
case int:   
    // ...一些操作  
case cbsStruct: // 自定义的结构体  
    // ...一些操作

// ...
}

문제를 발견하셨나요?

여기에 문제가 있습니다. 유형이 많고, 이 함수를 작성하는 데 매우 길고, 사용자 정의 유형도 있을 수 있으므로 이 판단을 변경해야 할 수도 있습니다. 왜냐하면 알 수 없는 값이 어떤 유형에 속하는지 알 수 있는 방법이 없기 때문입니다.

알 수 없는 유형을 꿰뚫어 볼 수 없는 경우 위 코드는 실제로 그다지 합리적이지 않습니다. 이때 이를 처리하는 데 도움이 되는 반사가 필요합니다. Reflection은 TypeOf 및 ValueOf 함수를 사용하여 값을 얻습니다. 인터페이스를 통해 대상 객체의 정보를 얻어 목적을 쉽게 달성할 수 있습니다.

3. 성찰은 정확히 무엇을 할 수 있나요?

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var name string = "咖啡色的羊驼"

    // TypeOf会返回目标数据的类型,比如int/float/struct/指针等
    reflectType := reflect.TypeOf(name)

    // valueOf返回目标数据的的值,比如上文的"咖啡色的羊驼"
    reflectValue := reflect.ValueOf(name)

    fmt.Println("type: ", reflectType)
    fmt.Println("value: ", reflectValue)
}
golang은 Reflect 패키지에서 리플렉션을 지원합니다. 주요 패키지에는 Get을 분리하는 데 사용되는 두 가지 메서드와 두 가지 구조체(정확히 말하면 구조체와 인터페이스)가 포함되어 있습니다. 인터페이스 변수의 동적 유형과 동적 값을 조작합니다.

두 가지 방법:

func TypeOf(i 인터페이스{}) 유형 {...}

메소드는 빈 인터페이스 유형의 변수를 전달받으며 실제 매개변수는 복사되어 빈 인터페이스 변수로 변환되고 최종적으로 TypeOf의 매개변수로 사용됩니다.

함수 내에서 인터페이스 변수의 동적 유형 정보를 꺼내서 반환을 위해 Reflect.Type으로 캡슐화합니다. 왜냐하면 Reflect.Type은 인터페이스이고 실제로 사용되는 것은 인스턴스이기 때문입니다. 인터페이스입니다. 실제 인스턴스는 Reflect.rtype입니다.

func ValueOf(i 인터페이스{}) Value {...}

TypeOf 함수 유형에서는 복사본도 받은 다음 빈 인터페이스 변수로 변환합니다. , 메소드에서 인터페이스 변수의 동적 값을 내부적으로 가져온 다음 Reflect.Value 객체로 캡슐화하여 반환합니다.

위 내용은 golang에서 반사가 중요합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.