亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何“強制”Golang func 獲取結構的新實例

如何“強制”Golang func 獲取結構的新實例

Go
夢里花落0921 2022-05-23 17:30:03
因此,結構包含可能發生突變的數據。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 的字段之一是指針 - 您仍然可以對其進行變異。


查看完整回答
反對 回復 2022-05-23
  • 1 回答
  • 0 關注
  • 129 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號