2017-12-21 19 views
-2

있습니다. []interface{}입니다. 반복하고, 스위치 내의 각 요소 유형을 확인하고 있습니다. 여러 개의 숫자 유형 (예 : int || float32 || float64)에 '포괄적 인'사례를 추가하고 싶습니다.Golang에서 switch 내에서 유형에 대한 논리 OR을 구현하십시오.

요소가 하나의 고유 한 유형인지 여부를 확인할 수 있지만 여러 유형을 검사하기위한 구문을 || (또는)으로 확인할 수없는 것 같습니다.

이것이 가능합니까? 나는 (Playground) 시도했다 :

package main 

import (
    "fmt" 
) 

func main() { 

    things := []interface{}{"foo", 12, 4.5, true} 

    for _, thing := range things { 

     switch t := thing.(type) { 

     // How can we implement logical OR for types to implement a catch-all for numerics? 
     // Throws error: "type <type> is not an expression" 
     // case (int || float64) : 
     // fmt.Printf("Thing %v is a 'numeric' type: %T\n", thing, t) 


     // Single discrete types work fine, of course 
     case string : 
      fmt.Printf("Thing %v is of type: %T\n", thing, t) 
     case int : 
      fmt.Printf("Thing %v is of type: %T\n", thing, t) 
     case float64 : 
      fmt.Printf("Thing %v is of type: %T\n", thing, t) 
     case bool : 
      fmt.Printf("Thing %v is of type: %T\n", thing, t) 
     default : 
      fmt.Printf("Thing %v is of unknown type\n", thing) 
     } 
    } 

} 
+0

다운 유권자, 이유를 설명해 주시겠습니까? (여기서 싸우는 것이 아니라, 더 나은 포럼 멤버가되어이 명백한 실수로부터 배우는 것이 진정 진실이다. – gpanda

+0

내가 누가 다운 투표를했는지 말할 수는 없지만, 스펙을 읽거나 [A Tour of Go] (https://tour.golang.org/welcome/1)를 읽으면 쉽게 대답 할 수있는 질문에 자주 사용됩니다. "연구 노력이 부족하다"는 단점이있다. – Flimzy

답변

5

를 글쎄, 나는 read the spec 때까지, 당신은 할 수 없었다 생각했다. 당신은 할 수 있습니다, 그것은 이동에있는 다른 switch 단지 여러 경우처럼 작동 :

case bool, string: 
    printString("type is bool or string") // type of i is type of x (interface{}) 
+0

매우 도움이됩니다. @Adrian. 나는 종종 내 것과 같은 질문을 보게 될 것이기 때문에 어리석은 생각을한다. '이런, 문서를 읽으 라.'하지만 스위치를 생각하지 않고 '형식'관련 문서를 찾고있었습니다. 영리한 의사의 헌팅 능력을 향상시키는 것 같은 느낌이 듭니다. – gpanda

+0

Go에 대한 가장 좋아하는 점 중 하나는 1 ~ 2 시간 안에 사양을 읽을 수 있다는 것입니다. 물론 모든 세부 사항을 유지하는 것은 완전히 다른 문제입니다! – Adrian

3

네, 가능합니다. 그러나 t의 유형은 case 또는 default 인 경우 interface{}입니다.

switch t := v.(type) { 
case string: 
    // t is of type string 
case int, int64: 
    // t is of type interface{}, and contains either an int or int64 
default: 
    // t is also of type interface{} here 
} 
+0

오 세상에, 간단! 는 여기에 '잡았다'입니다 - 우리가있는 경우에 우리는 경우 : 경우 INT, INT64 을 우리가 나중에 스위치를 아래로 단지 의 경우 INT를 확인할 수 없습니다. 감사합니다. @Flimzy! – gpanda

+0

@gpanda 그건 이런 종류의 스위치가 아니라 모든 Go 스위치의 일종입니다. 일치하는 항목을 찾으면 다음 사례를 확인하지 않습니다. 'passthrough'와'goto'를 사용하여이를 제거 할 수 있습니다. 너는 이것에 관심이 있니? 예를 들어 줄 수는 있지만 여기에 대한 의견보다는 공간이 더 필요합니다. 기존 답변에 아무 것도 추가하지 않으므로 필요없는 경우 답변으로 게시하지 않습니다. – Adirio

+1

@Adirio : 당신이'fallthrough '를 의미하는 것 같지만 전환 스위치가 작동하지 않습니다. – Flimzy