2016-10-20 6 views
0

警告:初心者に行ってください。私はこのような関数を持っています:関数をgoで複数の型を受け入れるようにするにはどうすればよいですか?

package main 
import "flag" 
import "fmt" 

func print_out_type(x anything) string { 
    switch v := x.(type) { 
     case string: 
      return "A string" 
     case int32: 
      return "An Integer" 
     default: 
      return "A default" 
    } 
} 

func main() { 
    wordPtr := flag.String("argument1", "foo", "a String") 
    numPtr := flag.Int("argument2", 42, "an Integer") 
    flag.Parse() 
    fmt.Println("word: ", *wordPtr) 
    fmt.Println("number: ", *numPtr) 
} 

私は、タイプに基づいて異なるタイプの文字列を返そうとしています。私はちょうど別の型の引数を受け入れる関数を書く方法のポイントに固執しています。どんな助けもありがとうございます。

+0

'FUNC print_out_type(Xインタフェース{})印刷されるタイプとして – sberry

+2

使用'インターフェースを{} 'STRING' 。これは空のインターフェイスです。どんなタイプでもそれを実装します。これは非常に基本的なものなので、Goに関する適切なチュートリアルを完了してください。 – kostix

答えて

1

インターフェイスタイプを引数として使用できます。この場合、指定されたインターフェイスを実装するすべての型で関数を呼び出すことができます。 Go型では、インタフェースのメソッドがあれば、自動的にそのインタフェースを実装します。だから、可能なすべての型を受け入れたいなら、空のインターフェース(interface{})を使うことができます。これは、すべての型がそれを実装しているからです。あなたの機能に他の変更を加える必要はありません。

func print_out_type(x interface{}) string { 
    switch v := x.(type) { 
     case string: 
      return "A string" 
     case int32: 
      return "An Integer" 
     default: 
      return "A default" 
    } 
} 

また、リフレクトパッケージを使用して、インターフェイス変数のタイプを調べることもできます。例えば:

func print_out_type(x interface{}) string { 
    return reflect.TypeOf(x).String() 
} 

func main() { 
    fmt.Println(print_out_type(42)) 
    fmt.Println(print_out_type("foo")) 
} 

INT

列を

-3
  1. まず、タイプアサーションを使用している場合、この操作が成功していることを確認する必要があります。 eg: value, ok := temp.(int)
  2. 第2に、interface{}タイプの変数を関数のパラメータとして使用できます。ファンクションでは、タイプアサーションを使用してパラメータの実数型をチェックし、プリントアウトすることができます。
+0

タイプスイッチでタイプアサーションを行う必要はありません。 – Kaedys

+0

OPはタイプアサーションを使用していません。 – jussius

関連する問題