인터페이스 변수 유형 결정: 고르디우스 매듭 슬라이싱
Go 프로그래밍 영역에서 인터페이스{} 유형을 사용하여 작업할 수 있습니다. 불확실성을 소개합니다. 자주 발생하는 한 가지 당혹스러운 질문은 인터페이스{} 변수에 슬라이스가 포함되어 있는지 여부를 확인하는 방법입니다.
이 딜레마를 해결하려면 제공된 함수를 자세히 살펴보겠습니다.
func name(v interface{}) { if is_slice() { for _, i := range v { my_var := i.(MyInterface) ... do smth } } else { my_var := v.(MyInterface) ... do smth } }
문제의 핵심은 파악하기 어려운 is_slice 방법에 있습니다. v가 실제로 슬라이스인지 식별하려면 런타임에 기본 유형을 검사할 수 있는 방법이 필요합니다. 여기서 Reflection이 작용합니다.
The Power of Reflection: Unmasking the True Nature
Go의 Reflection은 런타임에 값을 성찰하고 조작하는 수단을 제공합니다. 이를 통해 인터페이스 변수의 구체적인 유형을 얻고 원하는 유형(이 경우에는 슬라이스)과 일치하는지 확인할 수 있습니다.
다음 코드 조각은 is_slice를 구현하는 방법을 보여줍니다.
func IsSlice(v interface{}) bool { return reflect.TypeOf(v).Kind() == reflect.Slice }
reflect.TypeOf(v)를 호출하여 v의 구체적인 유형을 추출합니다. 그런 다음 Kind() 메서드는 유형의 종류를 반환하며, 이는 Slice를 포함한 여러 상수 중 하나일 수 있습니다. 따라서 이 조건이 true로 평가되면 v에 슬라이스 참조가 포함되어 있다고 자신있게 결론을 내릴 수 있습니다.
is_slice 메서드가 슬라이스의 존재를 확인하면 다음과 같이 반복을 진행할 수 있습니다.
for _, i := range v { my_var := i.(MyInterface) ... do smth }
또는 v가 슬라이스가 아닌 경우 else 블록이 실행되고 값은 개별 요소로 처리될 수 있습니다.
my_var := v.(MyInterface) ... do smth
추가 고려 사항:
위 내용은 Go에서 `인터페이스{}` 변수가 슬라이스를 보유하는지 확인하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!