首页 > 解决方案 > 避免空结构使用相同的地址

问题描述

为了在 Go 中使用更多有用的枚举,我尝试使用 struct 指针作为枚举值。如果结构有字段,这很好用,但对于空结构,我有时会多次获得相同的指针,无论我使用&Foo{}还是new(Foo).

有什么办法可以强制指针不同吗?

这就是我想要做的(在线尝试):

package main

type Foo struct{}

var FooValues = struct {
    Alpha   *Foo
    Bravo   *Foo
    Charlie *Foo
}{
    Alpha:   &Foo{}, // These pointers should all be different
    Bravo:   &Foo{}, // But sometimes
    Charlie: &Foo{}, // They are not
}

func main() {
    if FooValues.Alpha == FooValues.Charlie {
        panic("enum values are the same!")
    }
}

标签: gopointers

解决方案


有什么办法可以强制指针不同吗?

不可以。任何实现都可以使用相同的地址。你必须重新设计。

来自 Go 语言规范

指向不同的零大小变量的指针可能相等,也可能不相等。


推荐阅读