猿问

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

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

}


慕斯王
浏览 170回答 3
3回答

守候你守候我

尽管这个问题是在 3 年零 9 个月前首次提出的,但 IMO 仍然没有一个好的答案,所以让我提出一个。不需要反射,或者每次要清除变量时都创建一个新实例。而是创建一个原始的新实例,您将其保留在其初始归零状态,然后您可以在需要时复制对象的内存Reset()。(给@DaveC 的帽子提示指出一种Reset()方法更惯用。)您只需从您的归零值复制到您的对象使用指针指向的位置。下面读的“复制值的记忆是zeroA在引用的内存位置是a引用”:*a = *zeroA这是我的完整示例,您也可以在Go Playground 中尝试。(请注意,由于您的接收器forReset()是指向 type 的指针,A因此调用该Reset()方法允许您更新a更新在方法调用结束后继续存在的位置的值):package mainimport (    "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()如果要将结构重置为新的默认值,包括使用指针声明的任何子结构的副本,则需要做额外的工作。我希望这可以帮助其他人,这样他们就不必像我一样艰难地学习这一点。
随时随地看视频慕课网APP

相关分类

Go
我要回答