このプログラムの出力はmap []ですが、map [Id:true name:true]が必要です
私はSQL CRUDコードの一部を枯渇させようとしているのですが、データベースへの読み取りと書き込みを処理する永続化構造体を埋め込むとよいと思いました。以下の例では、永続化構造はInnerで、モデルはOuterになります。ありがとう!
http://play.golang.org/p/fsPqJ-6aLI
package main
import (
"fmt"
"reflect"
)
type Inner struct {
}
type Outer struct {
Inner
Id int
name string
}
func (i *Inner) Fields() map[string]bool {
typ := reflect.TypeOf(*i)
attrs := make(map[string]bool)
if typ.Kind() != reflect.Struct {
fmt.Printf("%v type can't have attributes inspected\n", typ.Kind())
return attrs
}
// loop through the struct's fields and set the map
for i := 0; i < typ.NumField(); i++ {
p := typ.Field(i)
if !p.Anonymous {
v := reflect.ValueOf(p.Type)
v = v.Elem()
attrs[p.Name] = v.CanSet()
}
}
return attrs
}
func main() {
val := Outer{}
fmt.Println(val.Fields()) // prints map[], but I want map[Id:true name:true]
}
できません。具体的にInner
は、それが埋め込まれている場所を認識していないでメソッドを呼び出しています。埋め込みは継承ではなく、単純な自動委任です。
おそらく、これらを共通の永続化インターフェース、またはデータ型の永続化を処理できる汎用関数でラップする方向を検討する必要があります。
さて、これを実際に試したい場合は、ポインタアドレスを介して外部構造体にアクセスできますが、アクセスしたい外部型を知る必要があります。つまり、リフレクションを介して取得することはできません。
outer := (*Outer)(unsafe.Pointer(i))
typ := reflect.TypeOf(*outer)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加