嵌套结构和反射中的引用传递
在 Go 中,了解嵌套结构以及如何在反射中通过引用传递它们是至关重要的。考虑一个场景,其中您有嵌套的 Client 和 Contact 结构:
<code class="go">type Client struct { Id int Age int PrimaryContact Contact Name string } type Contact struct { Id int ClientId int IsPrimary bool Email string }</code>
当您内省 Client 结构的 PrimaryContact 字段时,您可能会遇到“reflect.Value.Set using unaddressable value”恐慌。这是因为 PrimaryContact 是按值传递的,而不是按引用传递的。要解决此问题,我们需要使用反射通过引用传递 PrimaryContact。
使用 Value.Addr() 的解决方案
代码:
<code class="go">package main import ( "fmt" "reflect" ) type Client struct { Id int Age int PrimaryContact Contact Name string } type Contact struct { Id int ClientId int IsPrimary bool Email string } func main() { client := Client{} v := reflect.ValueOf(&client) primaryContact := v.FieldByName("PrimaryContact").Addr() primaryContact.FieldByName("Id").SetInt(123) primaryContact.FieldByName("ClientId").SetInt(456) primaryContact.FieldByName("IsPrimary").SetBool(true) primaryContact.FieldByName("Email").SetString("example@example.com") fmt.Printf("%+v\n", client) }</code>
输出:
{Id:0 Age:0 PrimaryContact:{Id:123 ClientId:456 IsPrimary:true Email:example@example.com} Name:}
要点:
以上是如何使用 Value.Addr() 在反射中通过引用传递嵌套结构?的详细内容。更多信息请关注PHP中文网其他相关文章!