如何从golang中的切片获取结构指针

soa*_*bar 1 struct pointers go slice

这是代码:

package main

import (
    "fmt"
)

type demo struct {
     name string
}

func main() {
     demo_slice := make([]demo, 3)
     demo_slice[0] = demo{"str1"}
     demo_slice[1] = demo{"str2"}
     demo_slice[2] = demo{"str3"}

     point_demo_slice := make([]*demo, 3)
     for index, value := range demo_slice {
          fmt.Printf("\n%v==++++++++++++++%p\n", value, &value)
          point_demo_slice[index] = &value
     }
}
Run Code Online (Sandbox Code Playgroud)

结果:

{str1}==++++++++++++++0x20818a220

{str2}==++++++++++++++0x20818a220

{str3}==++++++++++++++0x20818a220
Run Code Online (Sandbox Code Playgroud)

0x20818a220 是最后一个元素的指针值.

为什么所有指针值都相同?

如何获得正确的指针值?

icz*_*cza 5

你不是指切片的元素而是局部value变量:

fmt.Printf("\n%v==++++++++++++++%p\n", value, &value)
Run Code Online (Sandbox Code Playgroud)

因此所有指针值都是相同的(局部变量的地址value).如果需要指向切片元素的指针,请获取相应元素的地址:

fmt.Printf("\n%v==++++++++++++++%p\n", demo_slice[index], &demo_slice[index])
Run Code Online (Sandbox Code Playgroud)

这将产生以下输出,所有指针都不同:

{str1}==++++++++++++++0x104342e0

{str2}==++++++++++++++0x104342e8

{str3}==++++++++++++++0x104342f0
Run Code Online (Sandbox Code Playgroud)