2017-12-21 32 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

非常に参考になりました、@アドリアンありがとうございます。私は愚かな気持ちになります。私はよく私のような質問を見るでしょうし、グーグル、読んでもらえますが、スイッチを見ないと思うのではなく、タイプ関連のドキュメントを探していました。賢明なドックハンティング能力を持っているように感じてください。 – gpanda

+0

Goについての私の好きなことの1つは、1〜2時間でそのスペックを読むことがとても簡単です。もちろん、すべての詳細を保持することはまったく別の問題です! – Adrian

3

はい、それが可能です。しかし、tは、いずれの化合物にもinterface{}のタイプを持っています。casesまたはdefaultです。

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

おはよう、シンプル! ここに 'つかみ'があります - もし私たちが持っていれば: case int、int64 case int スイッチを後で確認できません。 ありがとう@Flimzy! – gpanda

+0

@gpandaこれは、このような種類のスイッチではなく、すべてのGoスイッチの障害です。一致するものが見つかるたびに、次のケースをチェックしません。これを避けるために 'パススルー'と 'goto'を使うことができます。あなたはこれに興味がありますか?私はあなたに例を挙げることができますが、私はこれのコメントよりも多くのスペースが必要です。既存の回答に何も追加しないため、必要がない場合は回答として投稿しません。 – Adirio

+1

@Adirio:あなたはフォールスルーを意味すると思いますが、フォールスルーはタイプスイッチでは機能しません。 – Flimzy