如何“强制”Golang func 获取结构的新实例

因此,结构包含可能发生突变的数据。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是唯一的?


梦里花落0921
浏览 115回答 1
1回答

跃然一笑

实际上,不,在您的示例中,这不会改变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 的字段之一是指针 - 您仍然可以对其进行变异。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go