5

Golang でさまざまなカスタム タイプを取り込めるヘルパー関数を作成しようとしていますが、希望どおりに正確に実行する方法がわかりません。状況は次のとおりです (ちなみに、私は HAL プロトコルを実装する JSON オブジェクトを返す API を作成しています。これは、リソースと関係が単なる ID ではなくリンクとして返されることを意味します)。

アプリには、学生、校長、学校など、多数のモデルがあります。これらの各モデルには、同じものもあれば異なるものもある多くのフィールドがあります。理想的には、構造体のフィールドを反復処理し、構造体の別のフィールドを変更できる関数が必要です。大きな課題は、これらの構造体が Student、Principal、School などの型になる可能性があることです...

モデル:

type Person struct {
    halgo.Links
    Id        bson.ObjectId 
    Firstname string        
    Lastname  string        
    Email     string        
}

type Student struct {
    Person `bson:",inline"`

    School mgo.DBRef
}

type School struct {
    Id      bson.ObjectId
    Address []string     
    Name    string       
    Description string
}

次に、基本的にこれらの構造体のいずれかを取り、( を使用してreflect) フィールドを反復処理し、各フィールドで何かを実行できる関数が必要です。

取る関数を試しましたinterface{}が、問題は、フィールドにアクセスするには引数を型アサートする必要があることです。そして、それができたとしても、とにかく各タイプ/モデルに対して個別の関数を書く必要があります.:

func GenerateLinksHelper(m interface{}) {
...
}

最終的には、多少任意の構造体を受け取り、そこにある場合とない場合があるフィールドに対して操作を実行する関数を作成する方法を見つけようとしています。

4

1 に答える 1

4

あなたが何をしようとしているのかよくわかりませんが、リフレクションを使用すると、フィールドが存在するかどうかを確認して、それに対して何かを行うことができます。

「反射の法則」の記事 ( http://blog.golang.org/laws-of-reflection )から派生した例。再生: http://play.golang.org/p/neU3j2MYvz

package main

import (
    "fmt"
    "reflect"
)

type T1 struct {
    A int
    B string
}

type T2 struct {
    A int
}

func fct(i interface{}) {
    s := reflect.ValueOf(i).Elem()
    typeOfT := s.Type()
    for i := 0; i < s.NumField(); i++ {
        f := s.Field(i)
        if typeOfT.Field(i).Name == "B" {
            fmt.Printf("I am %s and I have a field B: %s\n", typeOfT.Name(), f.Interface())
        }
    }

}

func main() {
    t1 := T1{23, "skidoo"}
    t2 := T2{23}
    fct(&t1)
    fct(&t2)
}
于 2014-05-12T21:54:33.167 に答える