489

Goでオブジェクトの型を見つけるにはどうすればよいですか? Python では、typeofオブジェクトの型を取得するために使用します。Goでも同様に、同じことを実装する方法はありますか?

これが私が繰り返しているコンテナです:

for e := dlist.Front(); e != nil; e = e.Next() {
    lines := e.Value
    fmt.Printf(reflect.TypeOf(lines))
}

この場合、文字列の配列であるオブジェクト行のタイプを取得できません。

4

16 に答える 16

532

実行時に変数の型を返す 3 つの方法を見つけました。

文字列フォーマットの使用

func typeof(v interface{}) string {
    return fmt.Sprintf("%T", v)
}

リフレクトパッケージの使用

func typeof(v interface{}) string {
    return reflect.TypeOf(v).String()
}

型アサーションの使用

func typeof(v interface{}) string {
    switch v.(type) {
    case int:
        return "int"
    case float64:
        return "float64"
    //... etc
    default:
        return "unknown"
    }
}

すべての方法には、異なる最適なユース ケースがあります。

  • 文字列の書式設定 - 短くてフットプリントが小さい (反映パッケージをインポートする必要はありません)

  • リフレクト パッケージ - 型に関する詳細が必要な場合は、完全なリフレクション機能にアクセスできます

  • 型アサーション - 型をグループ化できます。たとえば、すべての int32、int64、uint32、uint64 型を「int」として認識します。

于 2014-11-26T23:39:08.017 に答える
15

最良の方法は、Google でリフレクションの概念を使用することです。
reflect.TypeOfパッケージ名と一緒に型
reflect.TypeOf().Kind()を与える 下線付きの型を与える

于 2014-08-22T08:59:50.057 に答える
5

この変数がある場合:

var counter int = 5
var message string  = "Hello"
var factor float32 = 4.2
var enabled bool = false

1: fmt.Printf %T format : この機能を使用するには、「fmt」をインポートする必要があります

fmt.Printf("%T \n",factor )   // factor type: float32

2: Reflect.TypeOf関数 : この機能を使用するには、「reflect」をインポートする必要があります

fmt.Println(reflect.TypeOf(enabled)) // enabled type:  bool

3: Reflect.ValueOf(X).Kind() : この機能を使用するには、「reflect」をインポートする必要があります

fmt.Println(reflect.ValueOf(counter).Kind()) // counter type:  int
于 2019-12-26T15:06:12.770 に答える
2

使用できます:interface{}..(type)この遊び場のように

package main
import "fmt"
func main(){
    types := []interface{} {"a",6,6.0,true}
    for _,v := range types{
        fmt.Printf("%T\n",v)
        switch v.(type) {
        case int:
           fmt.Printf("Twice %v is %v\n", v, v.(int) * 2)
        case string:
           fmt.Printf("%q is %v bytes long\n", v, len(v.(string)))
       default:
          fmt.Printf("I don't know about type %T!\n", v)
      }
    }
}
于 2020-06-01T07:30:31.303 に答える