>백엔드 개발 >Golang >Golang에서 '인터페이스가 아닌 값에서는 스위치를 입력할 수 없습니다' 오류가 발생하는 이유는 무엇입니까?

Golang에서 '인터페이스가 아닌 값에서는 스위치를 입력할 수 없습니다' 오류가 발생하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-13 04:40:02913검색

Why Do I Get the

오류: Golang의 "인터페이스 값이 아닌 경우 스위치를 입력할 수 없습니다"

유형 어설션 작업을 할 때 " 비인터페이스 값에서는 스위치를 입력할 수 없습니다." 인터페이스가 아닌 값에 대해 유형 전환을 수행하려고 할 때 발생합니다.

Golang에서는 유형 전환을 사용하면 변수 유형에 따라 조건부로 코드를 실행할 수 있습니다. 그러나 변수는 인터페이스 유형이어야 합니다. 인터페이스는 구현 유형이 구현해야 하는 메소드 세트를 정의하는 계약을 나타냅니다.

제공된 코드 조각에서 Stringer라는 유형은 단일 String() 메소드로 정의됩니다. Number 유형은 String() 메소드도 구현하여 Stringer 인터페이스의 구체적인 구현을 만듭니다.

type Stringer interface {
    String() string
}

type Number struct {
    v int
}

func (number *Number) String() string {
    return strconv.Itoa(number.v)
}

그러나 n 변수에 대해 유형 전환을 시도하는 주 함수에서 오류가 발생합니다. , 이는 Stringer가 아닌 *Number 유형입니다.

func main() {
    n := &Number{1}
    switch v := n.(type) {
    case Stringer:
        fmt.Println("Stringer:", v)
    default:
        fmt.Println("Unknown")
    }
}

이 문제를 해결하려면 유형 어설션을 수행하기 전에 n을 인터페이스{}로 캐스팅해야 합니다. 이는 인터페이스{}가 임의의 값을 나타낼 수 있기 때문입니다.

func main() {
    n := &Number{1}
    switch v := interface{}(n).(type) {
    case Stringer:
        fmt.Println("Stringer:", v)
    default:
        fmt.Println("Unknown")
    }
}

n을 인터페이스{}로 캐스팅하면 기본적으로 유형 스위치가 n이 Stringer 유형일 가능성을 고려할 수 있습니다. 유형 스위치가 입력되면 n의 실제 유형이 결정되고 적절한 케이스 분기가 실행됩니다.

위 내용은 Golang에서 '인터페이스가 아닌 값에서는 스위치를 입력할 수 없습니다' 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.