Goでオブジェクトの種類を見つける方法は? Pythonでは、typeof
を使ってオブジェクトの型を取得しています。 Goでも同様に、同じ方法を実装する方法はありますか?
これが私が繰り返しているコンテナです。
for e := dlist.Front(); e != nil; e = e.Next() {
lines := e.Value
fmt.Printf(reflect.TypeOf(lines))
}
この場合、文字列の配列であるオブジェクト行の型を取得することはできません。
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
実行時に変数の型を返す方法は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"として認識
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
文字列表現を取得するには:
%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
私は反映から遠ざかるでしょう。パッケージ。代わりに%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)
}
最善の方法は、Googleのリフレクションの概念を使用することです。reflect.TypeOf
はパッケージ名とともにtypeを与えますreflect.TypeOf().Kind()
は下線を引くタイプを与える
手短に言うと、fmtパッケージの中でfmt.Printf("%T", var1)
またはその他の変種を使用してください。
実行時に "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)
}
構造体のフィールドの型を取得する
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
あなたはreflect.TypeOf
を使うことができます。
int
、string
):名前を返します(例:int
、string
)<package name>.<struct name>
の形式で返します(例:main.test
)あなただけのfmtパッケージfmt.Printf()メソッドを使用することができます、より多くの情報: https://golang.org/pkg/fmt/