2016-03-23 24 views
-1

これには反射が必要な場合がありますが、わかりません。私は構造体の中で必要なフィールドの配列をループさせようとしています。これらのフィールドのいずれかがnilの場合、私は本質的にエラーを投げたいです。私がダウンして、基本的なフォームを持っているが、私は行くにGolang変数構造体フィールド

はあなたがEmailTemplateと呼ばれる構造体を持っている想像variabelを経由して、構造体のフィールド名を渡す方法がわからない実現し、それが

をTEMPLATE_IDと呼ばれるフィールドを持っていますこの場合、私はEmailTemplate.TemplateIdが

emailDef.Fields nilであるかどうかを知りたい文字列配列[「れるtemplateId」]

である私は、これらのフィールドは、EmailTemplate構造体で、彼らがnilであればあるかどうかを確認したいです

for field := range emailDef.Fields { 
     fmt.Println(emailDef.Fields[field]) 
     if EmailTemplate.[emailDef.Fields[field]] == nil { 
      missingField := true 
     }   
    } 

は私が考えている行に沿っていますが、構造体が配列ではないので間違っていることがわかります。 emailDef.Fields [field]はTemplateIdと等しくなります

答えて

1

あなたのループのものは私には大変意味がありませんので、fieldという文字列の1つのフィールドを持つ一般的な例を挙げておきます。あなたがチェックしたいフィールドのスライスまたは配列を持っている場合は、fieldの現在の値を使ってそれを範囲指定することができます。

import "reflect" 

st := reflect.TypeOf(EmailTemplate) 
v, ok := st.FieldByName(field) 
if ok { 
    // field existed on EmailTemplate, now check if it's nil 
    if v.IsNil() { 
     // the field field on instance EmailTemplate was nil, do something 
    } 
} 

今あなたがチェックする必要があるフィールドのリストは、すべての非nilのは、その後、ちょうどそうのようなループを追加していると仮定しています。

for field := range requiredFields { 
    st := reflect.TypeOf(EmailTemplate) 
    v, ok := st.FieldByName(field) 
    if ok { 
     // field existed on EmailTemplate, now check if it's nil 
     if v.IsNil() { 
      // the field field on instance EmailTemplate was nil, do something 
      // maybe raise error since the field was nil 
    } else { 
     //the field wasn't found at all, probably time to raise an error 
    } 
    } 
} 

パッケージドキュメントはこちらです。 https://golang.org/pkg/reflect/

関連する問題