2012-07-17 4 views
13

golang의 type switch 문에 fallthrough가 허용되지 않는 이유가 궁금합니다.왜 형식 전환에서 fallthrough가 허용되지 않습니까?

specification에 따르면 다음과 같습니다. "허용되지 않는 이유에 대해 많이 설명하지 않은"전환 통과 "문은 입력 스위치에서 허용되지 않습니다."

첨부 된 코드는 유용 할 수도있는 전환 유형의 전환이라고 할 수있는 가능한 시나리오를 시뮬레이트하는 것입니다.

주의!이 코드는 작동하지 않으며 오류를 생성합니다. "전환 할 수 없습니다." 유형 전환에서 fallthrough 문을 허용하지 않을 때 가능한 이유가 무엇인지 궁금합니다.

//A type switch question 
package main 

import "fmt" 

//Why isn't fallthrough in type switch allowed? 
func main() { 
    //Empty interface 
    var x interface{} 

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

    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!") 
    } 
} 

답변

29

fallthrough을 어떻게 사용 하시겠습니까? 이 유형 스위치에서, i 변수는 호출 된 특정 케이스에 따라 유형이 있습니다. 따라서 case bool에서 i 변수는 bool으로 입력됩니다. 그러나 case string에 입력하면 이됩니다. 그래서 i이 불가능한 형식을 변형 시키거나, 새로운 변수 i string에 의해 음영 처리를 요청할 것입니다.이 값은 x이 아니기 때문에 아무런 가치가 없습니다. 사실 입니다. 여기


시도하고 문제를 설명하는 예입니다 :

switch i := x.(type) { 
case int: 
    // i is an int 
    fmt.Printf("%T\n", i); // prints "int" 
case bool: 
    // i is a bool 
    fmt.Printf("%T\n", i); // prints "bool" 
    fallthrough 
case string: 
    fmt.Printf("%T\n", i); 
    // What does that type? It should type "string", but if 
    // the type was bool and we hit the fallthrough, what would it do then? 
} 

유일하게 가능한 솔루션은 fallthrough 원인 interface{}i를 떠나 다음의 경우 표현하게하는 것입니다,하지만 그 것 혼란스럽고 나쁜 정의.

당신이 정말로이 동작을해야하는 경우 이미 기존 기능과 함께이 작업을 수행 할 수 있습니다

switch i := x.(type) { 
case bool, string: 
    if b, ok := i.(bool); ok { 
     // b is a bool 
    } 
    // i is an interface{} that contains either a bool or a string 
} 
+0

@KevinBallard, 내 나쁜. – Ben

+0

설명 주셔서 감사합니다. 그러나 fmt.Printf ("% T \ n", i)가 "bool"을 다시 인쇄하지 않는 이유를 정말로 이해할 수 없습니다. 규칙적인 fallthrough에서는 case 문이 무시되고 표현식이 무시됩니다. 아마도이 문제를 정규 스위치 문에 많이 관련 시켜서이 문제를 파악하기가 어려울 것입니다. – Karlek

+2

@Mandarin :'i'가'string' 인 경우 컴파일되는 코드는'i'가'bool' 인 경우 컴파일되지 않을 수 있습니다. 하나의 변수를 두 개의 다른 유형으로 처리하는 코드를 작성할 수 없습니다. 그렇다면'case bool '에 어떤 유형이 있을까요? 'bool '이 될 수는 없습니다.'string'이라면 반드시'case bool'에서 가지고 있던 값을 폐기해야합니다. 코드 없이는 쓸모가 없습니다. –

관련 문제