go - 如何“强制” Golang函数使用结构的新实例

标签 go

因此,一个结构保存的数据可能会发生变异。 Golang中是否有一些技巧或技术可以告诉func必须接受结构的新实例?换句话说,尽最大可能避免重用在事实之前已经被突变或在函数生命周期中可能被突变的数据。 (我可以避免更改内容,但团队中的其他开发人员可能无法获取备忘录)。

为了显示:

type CMRequest struct {
  Endpoint    string
  Method      string
}

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

显然Run()可以使cmreq中的数据发生变异,所以我想知道是否存在一个好的模式来强​​制每次创建新数据?我唯一能想到的就是保持该结构的 private 性,并执行以下操作:
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的存储位置是否唯一,但是我仍然不能每次都强制用户传递新数据。

最佳答案

实际上,不,在您的示例中,这不会使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
}

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

这是example in go playground。但是请注意,如果struct的字段之一是指针-您仍然可以对其进行突变。

关于go - 如何“强制” Golang函数使用结构的新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61017246/

相关文章:

memory - 为什么 `[0]byte` 在结构中的位置很重要?

sockets - Google Go Lang - 获取 net/http 的套接字 ID/fd 以与 syscall.Bind 一起使用

go - 将请求中的json转换为golang中的数组

go-run 在相对子模块上给我一个错误 `cannot find package`

go - Cloud-Run 进程失败,出现 500 状态代码和 membarrier gvisor 错误

unit-testing - 如何在go(golang)中测试未导出的(私有(private))函数?

mongodb - 生产中的MongoDB中的白名单IP地址

Go protobuf 包冲突

algorithm - Golang Slice-Java Arraylist-递归回溯-Classic Algo Powerset在Golang中无法按需工作

go - 为什么 fmt.Scanf 无法将小写字母读取为字节值?