リフレクションを使用した構造体フィールドの変更: CanSet() および Structs
リフレクションを使用して構造体フィールドを変更する場合は、原則を理解することが重要です
CanSet() for Structs
この例では、CanSet() が構造体フィールドに対して false を返すことに遭遇しました。これは、デフォルトでは、Go ではリフレクションを使用して構造体のエクスポートされていない (プライベート) フィールドを変更することができないためです。これは、内部構造体の状態の偶発的または悪意のある変更を防ぐためのセキュリティ対策です。
問題への対処
リフレクションを使用して構造体フィールドの値を設定するには、次の点を考慮してください。手順:
修正コード
問題を解決する修正コードは次のとおりです:
<code class="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]) }</code>
このコードは、Entry 構造体の Field1 値を正常に変更できるようになりました。
以上がリフレクションを使用して CanSet() と構造体で構造体フィールドを変更する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。