문제:
데이터 구조를 어떻게 반복할 수 있나요? (배열 또는 맵)에 대한 정확한 지식 없이 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!