Go 유형 스위치의 다중 케이스
유형 전환 변수에 인터페이스 값을 할당할 때 결과 유형은 사례 목록에 따라 다릅니다. 구조. switch-case 문에 여러 케이스 목록이 있으면 예기치 않은 동작이 발생할 수 있습니다.
제공한 코드 조각에서:
switch a := foo.(type){ case B, A: a.test() }
변수 a의 유형이 인터페이스이기 때문에 오류가 발생합니다.{} , A 또는 B가 아닙니다. 이는 케이스 목록에 여러 유형이 포함되어 있어 a 유형이 인터페이스 표현식 유형과 동일하게 유지되기 때문입니다. (foo).
이 문제를 해결하려면 사례 목록에 단일 유형만 포함되어야 합니다.
switch a := foo.(type){ case A: a.test() }
사례 목록을 특정 유형으로 제한하면 변수 a가 예상되는 유형을 갖게 됩니다. 유형을 사용하면 메서드 호출이 성공할 수 있습니다.
또는 어설션을 사용하여 인터페이스 유형을 명시적으로 어설션할 수도 있습니다. 표현식:
if a, ok := foo.(tester); ok { fmt.Println("foo has test() method") a.test() }
이 경우 변수 a는 어설션이 성공한 경우에만 예상되는 유형을 갖습니다(즉, ok가 true인 경우).
위 내용은 Go 유형 스위치의 여러 사례로 인해 어떻게 예기치 않은 동작이 발생할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!