因此,一个结构保存的数据可能会发生变异。 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/