>백엔드 개발 >Golang >Go의 유형 스위치에서 Fallthrough가 금지되는 이유는 무엇입니까?

Go의 유형 스위치에서 Fallthrough가 금지되는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-16 00:35:02229검색

Why is Fallthrough Prohibited in Go's Type Switches?

유형 스위치의 Fallthrough 금지:

Go에서 "fallthrough" 문은 다음 사례의 실행을 허용하는 언어 구성입니다. 명시적인 break 문이 없는 switch 문입니다. 그러나 유형 스위치에서는 fallthrough가 허용되지 않습니다.

왜 그럴까요?

유형 스위치는 표현식의 유형을 결정하고 이를 스위치 사례에 지정된 변수에 할당합니다. 이 변수는 스위치의 해당 지점에서 표현식의 특정 유형을 나타냅니다.

fallthrough가 허용되면 유형 불일치 문제가 발생합니다. 제공된 코드 조각을 고려해 보겠습니다.

//Empty interface
var x interface{}

//A int, float64, bool or string value
x = ...

switch i := x.(type) {
case int:
    fmt.Println(i + 1)
case float64:
    fmt.Println(i + 2.0)
case bool:
    fallthrough
case string:
    fmt.Printf("%v", i)
default:
    fmt.Println("Unknown type. Sorry!")
}

bool이 true인 경우 변수 i에는 인터페이스 x 내의 bool 값이 할당됩니다. fallthrough가 허용되면 문자열 케이스까지 실행이 계속됩니다. 그러나 그 시점에서 변수 i는 여전히 bool 값을 보유합니다. 이러한 유형 불일치로 인해 오류가 발생합니다.

또한 fallthrough 문은 변수 i의 유형을 변경할 수 없기 때문에 유형 스위치에서는 의미가 없습니다. 유형 스위치는 각 경우에 표현식 유형을 특정 유형으로 좁히기 위한 것입니다. fallthrough를 허용하면 이 목적이 무용지물이 됩니다.

원하는 동작을 달성하려면 아래와 같이 각 사례 내에서 명시적인 유형 변환이 포함된 switch 문을 사용할 수 있습니다.

switch i := x.(type) {
case bool, string:
    if b, ok := i.(bool); ok {
        fmt.Println(b) // value as bool
    } else {
        fmt.Printf("%v", i) // value as string
    }
default:
    fmt.Println("Unknown type. Sorry!")
}

이 접근 방식을 사용하면 , fallthrough 없이도 단일 switch 문 내에서 다양한 유형을 처리할 수 있습니다.

위 내용은 Go의 유형 스위치에서 Fallthrough가 금지되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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