因此,結構包含可能發生突變的數據。Golang 中是否有一些技巧或技術可以告訴 func 它必須接受結構的新實例?換句話說,盡量避免重用可能在事實發生之前已經發生變異或可能在 func 生命周期中發生變異的數據。(我可以避免變異的東西,但我團隊中的其他開發人員可能不會得到備忘錄)。為了顯示:type CMRequest struct { Endpoint string Method string}func (cmreq CMRequest) Run() (res *goreq.Response) { /// this could mutate cmreq}顯然 Run() 可以改變 cmreq 中的數據,所以我想知道是否有一個好的模式來強制每次創建新數據?我唯一能想到的是將結構保持私有,并執行以下操作:type cmrequest struct { Endpoint string Method string}func (cmreq cmrequest) Run() (res *goreq.Response) { /// this could mutate cmreq}然后公開一個輔助函數:func MakeRequestAndUnmarshalBody(d CMRequestNoReuse) (*goreq.Response) { // check that d has a unique memory location? cmreq := NewCPRequest(d) res := cmreq.Run() return res}所以輔助函數是公開的,并且每次都會創建一個新的結構實例?還有其他方法嗎?我仍然不能強制用戶每次都傳入新數據,盡管我可以檢查內存位置是否d CMRequestNoReuse是唯一的?
1 回答

躍然一笑
TA貢獻1826條經驗 獲得超6個贊
實際上,不,在您的示例中,這不會改變CMRequest實例中的數據:
func (cmreq CMRequest) Run() (res *goreq.Response) {
/// this could mutate cmreq
}
當你按值傳遞對象時,你實際上得到了它的副本,而不是引用它。
要變異,您需要通過指針傳遞。即Run方法看起來像:
func (cmreq *CMRequest) Run() (res *goreq.Response) {
/// this actually can mutate cmreq
}
然后您實際上可以通過指針訪問原始對象并可以對其進行變異。
這是go playground 中的示例。但請注意,如果 struct 的字段之一是指針 - 您仍然可以對其進行變異。
- 1 回答
- 0 關注
- 129 瀏覽
添加回答
舉報
0/150
提交
取消