在切片转换中保留标识符地址
在 Go 中,将字符串切片(values1)转换为字符串指针切片(values2) )提出了独特的挑战。下面提供的代码说明了这个问题:
values1 := []string{"a", "b", "c"} var values2 []*string for _, v := range values1 { fmt.Printf("%p | %T\n", v, v) values2 = append(values2, &v) }
不出所料,输出显示,values2 中的每个元素都指向相同的内存地址,尽管具有不同的值。发生这种情况是因为范围循环变量 v 是原始字符串值的副本,而不是指向它的指针。因此,即使在循环中分配了新值,v 仍然是一个字符串值。
解决方案实现
要解决此问题,我们必须附加地址原始切片元素到values2。这里有两种可能的解决方案:
1。为原始切片建立索引
for i, _ := range values1 { values2 = append(values2, &values1[i]) }
通过索引访问切片元素,我们获得所需的指针地址并保留它们的不同值。
2.使用临时变量
for _, v := range values1 { v2 := v values2 = append(values2, &v2) }
在这种方法中,我们声明一个临时变量(v2)来保存每个字符串值。通过将v2分配给&v2,我们创建了一个独立的指针值,确保values2包含唯一的指针。
保留标识符地址的含义
需要注意的是,保留标识符地址具有一定的含义:
以上是将 Go 字符串切片转换为字符串指针切片时如何保留原始内存地址?的详细内容。更多信息请关注PHP中文网其他相关文章!