私は非常に多くの質問を確認しましたが、今はかなり使っていますが、解決策が見つかりませんこのため。フィールドがポインタへのポインタのときに構造体フィールドの値を設定する
基本的に、私はさまざまなプリミティブへのポインタの構造体を持っています。構造体はアプリケーションのための設定であり、フィールドがポインタである理由は、デフォルトに設定されたフィールドと全く設定されていないフィールドの間で "必須"フィールドを強制するために判断できます。
私が最後にソースコードをリンクする今の簡単な例を使用することができます:
type Config struct {
A *string
B *int
C *bool
D *[]string // wildcard!
}
だから私は、私はを反復処理私の各要素に対して.Field
を与えるreflect.ValueOf(*cfg)
経由reflect.Value
を、つかみます。
各要素はCanAddr
またはCanSet
を渡しません。ポインタの後ろにある値を設定する方法が見つからないようです。これは言語の制限ですか?フィールドを非ポインタにする必要がありますか?これは、ユーザーが空の文字列を指定したか、まったく設定していないかどうかを判断する方法がないためにうまくいくでしょう。
[]文字列フィールドを設定/追加するためのボーナスポイント!それも、のミックスでスローされずに私を混乱させた!とにかく
、関連するコードはここにある:アドレス指定可能な値を取得するために
v := reflect.ValueOf(cfg).Elem()
t := v.Type()
で
t := reflect.TypeOf(*cfg)
v := reflect.ValueOf(*cfg)
:https://github.com/Southclaws/sampctl/blob/master/settings.go#L95-L116