Go의 유형 어설션: '인터페이스가 아닌 값에서 유형 전환을 할 수 없는 이유'와 해결 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2024-11-13 10:56:02
원래의
415명이 탐색했습니다.

Type Assertion in Go: Why

Go의 유형 어설션: "비인터페이스 값에서 스위치를 입력할 수 없음" 오류 해결

Go에서 유형 어설션을 사용할 때, "인터페이스가 아닌 값에서는 스위치를 입력할 수 없습니다."라는 오류가 발생할 수 있습니다. 사용자 정의 유형을 사용하는 예를 통해 이것이 의미하는 바와 해결 방법을 살펴보겠습니다.

다음 코드 조각을 고려하세요.

package main

import "fmt"
import "strconv"

type Stringer interface {
    String() string
}

type Number struct {
    v int
}

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

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

이 코드를 실행하면 "인터페이스가 아닌 값에서는 스위치를 입력할 수 없습니다." 오류가 발생합니다. 이는 비인터페이스 값에 대해 유형 어설션이 수행되고 있음을 나타냅니다. 이 경우 n은 인터페이스가 아닌 Number 구조체에 대한 포인터입니다.

해결책은 유형 어설션을 시도하기 전에 값을 인터페이스로 캐스팅하는 것입니다{}. 이는 유형 어설션이 인터페이스 값에 대해서만 수행될 수 있기 때문입니다. 수정된 코드는 다음과 같습니다.

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

이제 코드를 실행하면 "Stringer: 1"이 인쇄됩니다. n을 인터페이스{}에 캐스팅하면 유형 어설션을 위한 인터페이스 값으로 처리될 수 있기 때문입니다.

위 내용은 Go의 유형 어설션: '인터페이스가 아닌 값에서 유형 전환을 할 수 없는 이유'와 해결 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿