Go에서 유형 스위치를 사용하면 여러 유형에 대해 값을 일치시킬 수 있습니다. 그러나 유형 스위치에서 여러 사례를 사용하는 경우 변수 유형 할당을 이해하는 것이 중요합니다.
다음 코드 조각을 고려하세요.
package main import ( "fmt" ) type A struct { a int } func (this *A) test() { fmt.Println(this) } type B struct { A } func main() { var foo interface{} foo = A{} switch a := foo.(type) { case B, A: a.test() } }
이 코드를 실행하면 오류가 발생합니다. .test 정의되지 않음(인터페이스 {} 유형은 메서드가 없는 인터페이스입니다). 이 오류는 유형 전환에도 불구하고 변수 a가 유형 인터페이스{}를 유지하기 때문에 발생합니다.
이 동작을 이해하려면 Go 사양을 참조해야 합니다.
"TypeSwitchGuard에는 다음이 포함될 수 있습니다. 짧은 변수 선언. 해당 형식이 사용되면 변수는 각 절의 암시적 블록 시작 부분에 선언됩니다. 정확히 하나의 유형을 나열하는 절에서는 변수가 해당 유형을 갖습니다. TypeSwitchGuard의 표현식 유형입니다."
우리의 경우 Case 절에 여러 유형(B 및 A)이 지정되므로 변수 a는 TypeSwitchGuard의 표현식 유형을 유지합니다. 인터페이스{}. 이는 인터페이스{}에 test() 메서드가 없기 때문에 컴파일러가 test() 메서드 호출을 허용하지 않는다는 것을 의미합니다.
이 문제를 해결하려면 유형 어설션을 사용할 수 있습니다. 값이 특정 유형을 가지고 있다고 주장합니다. 다음은 유형 어설션을 사용하는 코드의 업데이트된 버전입니다.
package main import ( "fmt" ) type A struct { a int } func (this *A) test() { fmt.Println(this) } type B struct { A } func main() { var foo interface{} foo = &B{} if a, ok := foo.(tester); ok { fmt.Println("foo has test() method") a.test() } }
위 내용은 Go에서 여러 사례가 있는 유형 전환으로 인해 '정의되지 않은' 메서드 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!