2017-08-25 7 views
0

私は少し動いていますが、いくつかのテストを行っている間にこの奇妙な状況を発見しました。構造体のフィールドが復帰する

フィールドを変更する必要がある別のメソッドに変数を送るためにstructのメソッドを使用していますが、最後にチェックすると、フィールドが最初の値に戻り、混乱します。

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) 
} 

私が使っているモックオブジェクトでは、この構造体フィールドの値を単純に変更しています。

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) 

これは、私はいくつかの移動を学ぶためにオーバーつもりだだけの小さなプログラムですので、私は任意のヘルプ誰もが私を与えることができ感謝しています。

答えて

2

値で構造体を渡しています。これは、構造体を変更していない限り正常に動作しますが、変更すると実際にはコピーのみが変更されます。この作業を行うには、修正する必要がある構造体にポインタを使用する必要があります。

の代わりに:

func (this MockConnector) sendCommand(payload map[string]string) 

使用:受信機がないよう

func (this *MockConnector) sendCommand(payload map[string]string) 

また、移動中の受信機名としてthis(またはself)を使用することは悪い考えと考えられています他の言語のthisポインタ/リファレンスと同じものです。

もう1つのベストプラクティスは、特定の型の1つのメソッドにポインタ受信者が必要な場合、その型のすべてのメソッドにはポインタ受信者が必要です。これは、値がポインタであるかどうかにかかわらず、メソッドセットが一貫しているようにするためです。

詳細については、method setsおよびtheseFAQanswersを参照してください。

+0

ありがとう、私はそれが何かを持っていたと思っていたが、このfunc(このMockConnector)sendCommand(* payload map [string] string)のような実際のペイロードへのポインタを渡そうとした。 Pythonのバックグラウンドのようにポインタは私が慣れるために必要なものです。 – cllamach

+0

また、受信者の名前として何か使用できますか?レシーバのコミュニティには良いコード名はありませんか?それはどういうわけか....解放している。ご協力いただきありがとうございます。 – cllamach

+0

あなたが望むものを使用してください。この場合、 'mock'や' conn'などを使用しますが、それは私だけです...名前を選ぶときにパラメータであるとふりまとうのがよいでしょう。 –