> 백엔드 개발 > Golang > Go에서 알 수 없는 데이터 구조를 어떻게 반복할 수 있나요?

Go에서 알 수 없는 데이터 구조를 어떻게 반복할 수 있나요?

Susan Sarandon
풀어 주다: 2024-12-17 15:46:10
원래의
488명이 탐색했습니다.

How Can I Iterate Over Unknown Data Structures in Go?

정확한 유형을 알지 못한 채 Go에서 데이터 구조 반복

문제:

데이터 구조를 어떻게 반복할 수 있나요? (배열 또는 맵)에 대한 정확한 지식 없이 Go에서 type?

실패한 시도:

아래 코드는 맵이나 배열을 나타내는 인터페이스를 반복하고 각 항목에 대해 함수를 실행하려고 시도하지만 실패합니다. 유형 검사로 인해

func DoTheThingToAllTheThings(data_interface interface{}) int {
    var numThings int

    switch data := data_interface.(type) {
    case map[interface{}]interface{}:
        numThings = len(data)
        // ...
    case []interface{}:
        numThings = len(data)
        // ...
    default:
        fmt.Println("uh oh!")
    }

    return numThings
}
로그인 후 복사

해결책:

fmt.Printf("%vn", data_interface) 함수는 유형 없이 데이터 구조를 반복하는 방법을 제공합니다. 캐스팅.

func PrintData(data_interface interface{}) {
    fmt.Printf("%v\n", data_interface)
}
로그인 후 복사

이것은 fmt.Printf의 %v 동사가 다음을 사용하기 때문에 작동합니다. Reflection을 사용하여 인수 유형을 결정하고 그에 따라 인쇄합니다.

Go의 Reflection:

fmt.Printf 함수는 내부적으로 Reflect 패키지를 사용하여 인수 유형을 검사합니다. 인수를 지정하고 형식을 지정하는 방법을 결정합니다. Reflect.ValueOf(arg)는 인수의 실제 값을 나타내는 Reflect.Value 객체를 반환하고, Reflect.TypeOf(arg)는 값의 유형을 반환합니다.

예:

다음 코드는 Board 구조체를 반영한 ​​다음 동일한 변수로 재구성합니다. type.

type Board struct {
    Tboard  [9]string
    Player1 Player
    Player2 Player
}

func main() {
    myBoard := makeBoard()

    v := reflect.ValueOf(*myBoard)
    t := v.Type()

    var b2 Board

    b2 = v.Interface().(Board)
    fmt.Printf("v converted back to: %#v\n", b2)
}
로그인 후 복사

참고:

리플렉션을 사용하려면 데이터 구조의 유형을 내보내야 합니다. 즉, 대문자로 시작해야 합니다.

위 내용은 Go에서 알 수 없는 데이터 구조를 어떻게 반복할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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