Go 中的结构体字段反转
当尝试在 Go 程序中修改结构体中的字段时,您可能会遇到这样的情况:字段似乎恢复到其原始值。出现此问题的原因是 Go 中按值传递结构的方式。
在您的代码中,MockConnector 结构有两个字段:last_command 和 value。 MockConnector 的 sendCommand 方法修改这些字段。但是,当您从 TVManager 结构调用 manager.sendMessage 时,您将连接器实例作为值传递。这意味着 sendCommand 接收连接器结构的副本,而不是对原始结构的引用。
要解决此问题,您需要使用指向所涉及结构的指针。通过传递指向结构的指针,您可以传递对内存中实际结构的引用。这允许您直接修改结构体的字段。
更正的代码:
func (this *MockConnector) sendCommand(payload map[string]string) { fmt.Println("0", this) this.last_command = payload this.value = true fmt.Println("0", this) }
通过修改 sendCommand 方法来接收指向 MockConnector 结构体的指针,现在,您可以修改实际的连接器实例,而不仅仅是副本。
接收器名称:
此外,避免在 Go 中使用此作为接收器名称被认为是最佳实践结构方法。相反,使用更具描述性的名称来指示接收器的类型。
一致方法集:
如果结构体中的一个方法需要指针接收器,建议使该结构中的所有方法都使用指针接收器。这可以确保方法集中的一致性,无论接收者是值还是指针。
通过应用这些建议,您可以消除 Go 程序中字段值恢复的问题。
以上是为什么我的 Go struct 字段修改后会恢复为原始值?的详细内容。更多信息请关注PHP中文网其他相关文章!