3 回答
TA贡献1802条经验 获得超10个赞
尽管这个问题是在 3 年零 9 个月前首次提出的,但 IMO 仍然没有一个好的答案,所以让我提出一个。
不需要反射,或者每次要清除变量时都创建一个新实例。而是创建一个原始的新实例,您将其保留在其初始归零状态,然后您可以在需要时复制对象的内存Reset()。(给@DaveC 的帽子提示指出一种Reset()方法更惯用。)
您只需从您的归零值复制到您的对象使用指针指向的位置。下面读的“复制值的记忆是zeroA在引用的内存位置是a引用”:
*a = *zeroA
这是我的完整示例,您也可以在Go Playground 中尝试。(请注意,由于您的接收器forReset()是指向 type 的指针,A因此调用该Reset()方法允许您更新a更新在方法调用结束后继续存在的位置的值):
package main
import (
"fmt"
)
type A struct {
Name string
Level int
}
var zeroA = &A{}
func (a *A) Reset() {
*a = *zeroA
}
func main() {
a1 := A{"Momo", 1}
a2 := &a1
a3 := a1
fmt.Println(a1)
fmt.Println(a2)
fmt.Println(a3)
a1.Reset()
fmt.Println(a1)
fmt.Println(a2)
fmt.Println(a3)
}
这是您的输出(请注意,我证明您的变量已清零,指向该变量的指针也已清零,但如果您制作了原始文件的 *copy*,则不会清零):
{Momo 1}
&{Momo 1}
{Momo 1}
{ 0}
&{ 0}
{Momo 1}
您还可以使用此技术复制包含默认值的结构体的值。但是请注意,这是浅拷贝,而不是深拷贝。如果您struct包含任何作为指针的属性,则此方法也将复制指针值,并且不会分配内存以指向所指向值的新副本。因此,Reset()如果要将结构重置为新的默认值,包括使用指针声明的任何子结构的副本,则需要做额外的工作。
我希望这可以帮助其他人,这样他们就不必像我一样艰难地学习这一点。
- 3 回答
- 0 关注
- 169 浏览
添加回答
举报