タグ付けされた質問 「go-reflect」

14
Goでオブジェクトのタイプを見つける方法は?
Goでオブジェクトのタイプを見つけるにはどうすればよいですか?Pythonでは、typeofオブジェクトのタイプを取得するために使用します。同様にGoで、同じものを実装する方法はありますか? これが私が反復しているコンテナです: for e := dlist.Front(); e != nil; e = e.Next() { lines := e.Value fmt.Printf(reflect.TypeOf(lines)) } この場合、文字列の配列であるオブジェクト行のタイプを取得できません。
387 go  go-reflect 


6
インターフェイスのスライスの型変換
囲碁does'tが暗黙的に変換し、なぜ私が興味[]Tに[]interface{}それは暗黙的に変換されますときTにinterface{}。私が見逃しているこの変換について重要なものはありますか? 例: func foo([]interface{}) { /* do something */ } func main() { var a []string = []string{"hello", "world"} foo(a) } go build 文句を言う (型[]文字列)を関数引数の型[]インターフェイス{}として使用することはできません そして私がそれを明示的にやろうとすると、同じこと:b := []interface{}(a)文句を言う (タイプ[]文字列)をタイプ[]インターフェース{}に変換できません したがって、私はこの変換を行う必要があるたびに(これは非常に多く現れるようです)、次のようなことをしています。 b = make([]interface{}, len(a), len(a)) for i := range a { b[i] = a[i] } これを行うより良い方法、またはこれらの変換を支援する標準ライブラリ関数はありますか?intや文字列などのリストを取得できる関数を呼び出すたびに、コードを4行追加するのはばかげているようです。

5
2つの構造体、スライス、またはマップが等しいかどうかを比較するにはどうすればよいですか?
2つの構造体、スライス、マップが等しいかどうかを確認したいと思います。 しかし、次のコードで問題が発生しています。関連する行で私のコメントを参照してください。 package main import ( "fmt" "reflect" ) type T struct { X int Y string Z []int M map[string]int } func main() { t1 := T{ X: 1, Y: "lei", Z: []int{1, 2, 3}, M: map[string]int{ "a": 1, "b": 2, }, } t2 := T{ X: 1, Y: …
131 go  go-reflect 

3
Goの構造体のフィールドを反復処理する
基本的に、aのフィールドの値を反復処理する(私が知っている)唯一の方法structは次のとおりです。 type Example struct { a_number uint32 a_string string } //... r := &Example{(2 << 31) - 1, "...."}: for _, d:= range []interface{}{ r.a_number, r.a_string, } { //do something with the d } を達成[]interface{}{ r.a_number, r.a_string, }するためのより優れた、より用途の広い方法があるかどうか疑問に思っていたので、各パラメーターを個別にリストする必要はありませんか、あるいは、構造体をループするより良い方法はありますか? reflectパッケージを調べてみましたが、取り出しreflect.ValueOf(*r).Field(0)た後どうすればよいかわからないため、壁にぶち当たりました。 ありがとう!
107 go  go-reflect 

2
リフレクトを使用して、構造体フィールドの値をどのように設定しますか?
reflectパッケージを使用して構造体フィールドを操作するのに大まかな時間がかかります。特に、フィールド値の設定方法を理解していません。 タイプt構造体{fi int; fs string} var rt = t {123、 "jblow"} var i64 int64 = 456 フィールド名iを取得-これは動作するようです var field = reflect.TypeOf(r).Field(i).Name フィールドiの値をa)インターフェイス{}、b)intとして取得-これは機能するようです var iface interface{} = reflect.ValueOf(r).Field(i).Interface() var i int = int(reflect.ValueOf(r).Field(i).Int()) フィールドiの値の設定-1つ試す-パニック reflect.ValueOf(r).Field(i).SetInt( i64 ) panic:エクスポートされていないフィールドを使用して取得した値を使用するreflect.Value・SetInt フィールド名「id」と「name」が好きではなかったので、「Id」と「Name」に名前が変更されました a)この仮定は正しいですか? b)正しい場合、同じファイル/パッケージ内にあるため必要ではないと考えた フィールドiの値を設定-2つ試す(フィールド名を大文字にして)-パニック reflect.ValueOf(r).Field(i).SetInt( 465 ) reflect.ValueOf(r).Field(i).SetInt( i64 ) panic:reflect.Value・アドレス指定不可能な値を使用したSetInt @peterSOによる以下の指示は、徹底的で高品質です 四。これは機能します: …

2
Goで関数の名前を取得する方法は?
関数が与えられた場合、その名前を取得することは可能ですか?いう: func foo() { } func GetFunctionName(i interface{}) string { // ... } func main() { // Will print "name: foo" fmt.Println("name:", GetFunctionName(foo)) } runtime.FuncForPCが役立つと言われましたが、使用方法を理解できませんでした。

3
スライスを格納するインターフェース上の範囲{}
あなたが受け入れる関数を持っているシナリオを考えるとt interface{}。tスライスであると判断された場合、そのスライスをどのようにrange上書きしますか? func main() { data := []string{"one","two","three"} test(data) moredata := []int{1,2,3} test(data) } func test(t interface{}) { switch reflect.TypeOf(t).Kind() { case reflect.Slice: // how do I iterate here? for _,value := range t { fmt.Println(value) } } } Go Playgroundの例:http : //play.golang.org/p/DNldAlNShB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.