为了账号安全,请及时绑定邮箱和手机立即绑定

如何动态清除类型结构实例的值

如何动态清除类型结构实例的值

Go
慕斯王 2021-09-21 22:19:38
Go 是否可以创建一个动态清除结构实例值的方法?type A struct {    Name string    Level int}type B struct {    Skill string}func main() {    a := A{"Momo", 1}    b := B{"Starfall"}    // outputs    // {"Momo", 1}    // {"Starfall"}    clear(a)    clear(b)    // outputs    // { , 0}    // { }}func clear(v interface{}) {    // some code}
查看完整描述

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()如果要将结构重置为新的默认值,包括使用指针声明的任何子结构的副本,则需要做额外的工作。


我希望这可以帮助其他人,这样他们就不必像我一样艰难地学习这一点。


查看完整回答
反对 回复 2021-09-21
  • 3 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信