我在玩Go,但是在做一些测试时发现了这种奇怪的情况。
我在结构中使用method来将变量发送到另一个应该更改字段的方法,但是当我在最后检查它时,该字段又回到了第一个值,这让我感到困惑。
func (this TVManager) sendMessage(message string) { fmt.Println("5", this.connector) payload := map[string]string { "id": "0", "type": "request", "uri": "ssap://system.notifications/createToast", "payload": "{'message': 'This is a message'}"} this.connector.sendCommand(payload) fmt.Println("4", this.connector) }
这是我正在测试的方法,它调用连接器的sendCommand。
func (this MockConnector) sendCommand(payload map[string]string) { fmt.Println("0", this) this.last_command = payload this.value = true fmt.Println("0", this) }
我正在使用的模拟对象中的哪个仅仅是更改此struct字段的值。
manager.sendMessage("This is a message") fmt.Println("1", connector) assert.Equal(t, expected, connector.last_command, "Command should be equal")
但是,当我检查它时,它又回到了内部。我设置了一些打印件以尝试d跟踪值,然后它们按预期方式更改了值,但随后又恢复了。
1 {false map[]} 5 {false map[]} 0 {false map[]} 0 {true map[uri:ssap://system.notifications/createToast payload:{'message': 'This is a message'} id:0 type:request]} 4 {false map[]} 1 {false map[]} --- FAIL: TestTVManagerSendsNotificationDownToConnector (0.00s)
这只是一个小程序,我将学习一些Go语言,因此,我感谢任何人都能给我的帮助。
您正在按值传递结构。只要您不修改结构,此方法就可以正常工作,但是,如果您修改它,则实际上仅在修改副本。为了使这项工作有效,您需要使用 指向 需要修改的结构的 指针 。
代替:
func (this MockConnector) sendCommand(payload map[string]string)
用:
func (this *MockConnector) sendCommand(payload map[string]string)
另外,在Go中使用this(或self)作为接收方名称也是一个坏主意,因为接收方与this其他语言中的指针/引用不同。
this
self
另一种最佳实践是,如果给定类型的一种方法需要指针接收器,则该类型的所有方法都应具有指针接收器。这样,无论值是否是指针,方法集都保持一致。
请参阅方法集和这些 FAQ 答案以获取更多信息。