リフレクションを使用した構造体フィールドの変更: CanSet() および Structs
リフレクションを使用して構造体フィールドを変更する場合は、原則を理解することが重要ですフィールドのアクセシビリティと変更の背後にあります。
CanSet() for Structs
この例では、構造体フィールドに対して false を返す CanSet() が発生しました。これは、デフォルトでは、Go ではリフレクションを使用して構造体のエクスポートされていない (プライベート) フィールドを変更することができないためです。これは、内部構造体の状態の偶発的または悪意のある変更を防ぐためのセキュリティ対策です。
問題への対処
リフレクションを使用して構造体フィールドの値を設定するには、次の点を考慮してください。手順:
修正コード
問題に対処する修正コードは次のとおりです:
func SetField(source interface{}, fieldName string, fieldValue string) {
v := reflect.ValueOf(source).Elem()
fmt.Println(v.FieldByName(fieldName).CanSet())
if v.FieldByName(fieldName).CanSet() {
v.FieldByName(fieldName).SetString(fieldValue)
}
}
func main() {
source := ProductionInfo{}
source.StructA = append(source.StructA, Entry{Field1: "A", Field2: 2})
fmt.Println("Before: ", source.StructA[0])
SetField(&source.StructA[0], "Field1", "NEW_VALUE")
fmt.Println("After: ", source.StructA[0])
}
このコードは、Entry 構造体の Field1 値を正常に変更できるようになりました。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3