Golang - 如何将结构添加到切片并保留内存地址?

ale*_*oon -3 go

如下所示,我创建实例并添加到切片。我想保留实例的内存地址,但事实并非如此。

type Person struct {
    name string
}

func main() {
    p := Person{name: "foo"}
    ps1 := []Person{p}
    ps2 := []Person{p}
    
    fmt.Printf("%p\n", &p) // 0xc000010250
    fmt.Printf("%p\n", &ps1[0]) // 0xc000010260
    fmt.Printf("%p\n", &ps2[0]) // 0xc000010270
}
Run Code Online (Sandbox Code Playgroud)

我知道如果我使用指针和指针切片是可能的。

type Person struct {
    name string
}

func main() {
    p := Person{name: "foo"}
    ps1 := []*Person{&p}
    ps2 := []*Person{&p}

    fmt.Printf("%p\n", &p) // 0xc00010a210
    fmt.Printf("%p\n", ps1[0]) // 0xc00010a210
    fmt.Printf("%p\n", ps2[0]) // 0xc00010a210
}
Run Code Online (Sandbox Code Playgroud)

但是,我想将 ps1 和 ps2 设置为 []Person 类型,因为后面的方法的参数类型(不在此处)。有什么办法吗?

dav*_*ave 5

Go 程序中定义的每个变量都占用唯一的内存位置。不可能创建两个变量共享内存中相同存储位置的 Go 程序。可以创建两个内容指向同一存储位置的变量,但这与共享同一存储位置的两个变量不同。

简而言之,不,如果您想要ps1[0]ps2[0]指向内存中的同一位置,则必须使用[]*Person