繁体   English   中英

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

[英]How to “force” Golang func to take a new instance of a struct

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

所以辅助函数是公开的,并且每次都会创建一个新的结构实例? go 还有其他方法吗? 我仍然不能每次都强制用户传入新数据,尽管我可以检查d CMRequestNoReuse的 memory 位置是否唯一?

实际上,不,在您的示例中,这不会改变CMRequest实例中的数据:

func (cmreq CMRequest) Run() (res *goreq.Response) {
 /// this could mutate cmreq
}

当您按值传递 object 时,您实际上得到了它的副本,而不是引用它。

要变异,您需要通过指针传递。 Run方法看起来像:

func (cmreq *CMRequest) Run() (res *goreq.Response) {
 /// this actually can mutate cmreq
}

然后您实际上可以通过指针访问原始 object 并可以对其进行变异。

这是go 操场中的示例 但请注意,如果 struct 的字段之一是指针 - 您仍然可以对其进行变异。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM