首页 > 后端开发 > Golang > 将 Go 字符串切片转换为字符串指针切片时如何保留原始内存地址?

将 Go 字符串切片转换为字符串指针切片时如何保留原始内存地址?

Patricia Arquette
发布: 2024-12-26 11:09:14
原创
442 人浏览过

How to Preserve Original Memory Addresses When Converting a Go Slice of Strings to a Slice of String Pointers?

在切片转换中保留标识符地址

在 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包含唯一的指针。

保留标识符地址的含义

需要注意的是,保留标识符地址具有一定的含义:

  • values1 的后备数组保留在内存中只要values1和values2都可达。
  • 对values1元素的修改将反映在values2中。
  • 要防止values1被垃圾回收,请使用索引或临时变量,如中所述以上解决方案。

以上是将 Go 字符串切片转换为字符串指针切片时如何保留原始内存地址?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板