web-dev-qa-db-ja.com

Goでオブジェクトの種類を見つける方法は?

Goでオブジェクトの種類を見つける方法は? Pythonでは、typeofを使ってオブジェクトの型を取得しています。 Goでも同様に、同じ方法を実装する方法はありますか?

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

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

この場合、文字列の配列であるオブジェクト行の型を取得することはできません。

298
Rahul

Goリフレクションパッケージには、変数の種類を調べるためのメソッドがあります。

次のスニペットは、文字列の反射型、整数および浮動小数点数を出力します。

package main

import (
    "fmt"
    "reflect"
)

func main() {

    tst := "string"
    tst2 := 10
    tst3 := 1.2

    fmt.Println(reflect.TypeOf(tst))
    fmt.Println(reflect.TypeOf(tst2))
    fmt.Println(reflect.TypeOf(tst3))

}

実際に表示するには、 http://play.golang.org/p/XQMcUVsOja を参照してください。

ここでより多くのドキュメンテーション: http://golang.org/pkg/reflect/#Type

370
dethtron5000

実行時に変数の型を返す方法は3つあります。

文字列フォーマットを使用する

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

reflectパッケージを使用

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"として認識

372

reflect パッケージを使用してください。

パッケージreflectはランタイムリフレクションを実装し、プログラムが任意の型のオブジェクトを操作することを可能にします。一般的な使い方は、静的型インタフェース{}で値を取得し、TypeOfを呼び出してその動的型情報を抽出することです。

package main

import (
    "fmt"
    "reflect"
)

func main() {
    b := true
    s := ""
    n := 1
    f := 1.0
    a := []string{"foo", "bar", "baz"}

    fmt.Println(reflect.TypeOf(b))
    fmt.Println(reflect.TypeOf(s))
    fmt.Println(reflect.TypeOf(n))
    fmt.Println(reflect.TypeOf(f))
    fmt.Println(reflect.TypeOf(a))
}

を生成します。

bool
string
int
float64
[]string

遊び場

ValueOf(i interface{}).Kind()を使用した例:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    b := true
    s := ""
    n := 1
    f := 1.0
    a := []string{"foo", "bar", "baz"}

    fmt.Println(reflect.ValueOf(b).Kind())
    fmt.Println(reflect.ValueOf(s).Kind())
    fmt.Println(reflect.ValueOf(n).Kind())
    fmt.Println(reflect.ValueOf(f).Kind())
    fmt.Println(reflect.ValueOf(a).Index(0).Kind()) // For slices and strings
}

を生成します。

bool
string
int
float64
string

遊び場

48
Intermernet

文字列表現を取得するには:

からhttp://golang.org/pkg/fmt/

%T値の型のGo構文表現

package main
import "fmt"
func main(){
    types := []interface{} {"a",6,6.0,true}
    for _,v := range types{
        fmt.Printf("%T\n",v)
    }
}

出力:

string
int
float64
bool
42
globby

私は反映から遠ざかるでしょう。パッケージ。代わりに%Tを使用してください

package main

import (
    "fmt"
)

func main() {
    b := true
    s := ""
    n := 1
    f := 1.0
    a := []string{"foo", "bar", "baz"}

    fmt.Printf("%T\n", b)
    fmt.Printf("%T\n", s)
    fmt.Printf("%T\n", n)
    fmt.Printf("%T\n", f)
    fmt.Printf("%T\n", a)
 }
14
harold ramos

最善の方法は、Googleのリフレクションの概念を使用することです。
reflect.TypeOfはパッケージ名とともにtypeを与えます
reflect.TypeOf().Kind()は下線を引くタイプを与える

10
Jiten

手短に言うと、fmtパッケージの中でfmt.Printf("%T", var1)またはその他の変種を使用してください。

7

実行時に "reflect"パッケージのTypeOf関数を使うかfmt.Printf()を使うことで、変数やインスタンスの型をチェックすることができます。

package main

import (
   "fmt"
   "reflect"
)

func main() {
    value1 := "Have a Good Day"
    value2 := 50
    value3 := 50.78

    fmt.Println(reflect.TypeOf(value1 ))
    fmt.Println(reflect.TypeOf(value2))
    fmt.Println(reflect.TypeOf(value3))
    fmt.Printf("%T",value1)
    fmt.Printf("%T",value2)
    fmt.Printf("%T",value3)
}
3
Kabeer Shaikh

構造体のフィールドの型を取得する

package main

import (
  "fmt"
  "reflect"
)

type testObject struct {
  Name   string
  Age    int
  Height float64
}

func main() {
   tstObj := testObject{Name: "yog prakash", Age: 24, Height: 5.6}
   val := reflect.ValueOf(&tstObj).Elem()
   typeOfTstObj := val.Type()
   for i := 0; i < val.NumField(); i++ {
       fieldType := val.Field(i)
       fmt.Printf("object field %d key=%s value=%v type=%s \n",
          i, typeOfTstObj.Field(i).Name, fieldType.Interface(),
          fieldType.Type())
   }
}

出力

object field 0 key=Name value=yog prakash type=string 
object field 1 key=Age value=24 type=int 
object field 2 key=Height value=5.6 type=float64

IDE https://play.golang.org/p/bwIpYnBQiE を参照

2
negi Yogi

あなたはreflect.TypeOfを使うことができます。

  • 基本型(例:intstring):名前を返します(例:intstring
  • struct:何かを<package name>.<struct name>の形式で返します(例:main.test
1
夜阑听风

リフレクト パッケージが救いに来る:

reflect.TypeOf(obj).String()

これをチェック デモ

0

あなただけのfmtパッケージfmt.Printf()メソッドを使用することができます、より多くの情報: https://golang.org/pkg/fmt/

例: https://play.golang.org/p/aJG5MOxjBJD

0
JORDANO