登录
首页 >  Golang >  Go问答

将字符串切片转换为指向字符串的指针切片

来源:Golang技术栈

时间:2023-04-15 15:25:29 133浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《将字符串切片转换为指向字符串的指针切片》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下golang,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

我想将字符串切片转换为指向字符串的指针切片

values1 := []string{"a", "b", "c"}
var values2 []*string
for _, v := range values1 {
    fmt.Printf("%p | %T\n", v, v)
    values2 = append(values2, &v)
}
fmt.Println(values2)

%!p(string=a) => 字符串
%!p(string=b) => 字符串
%!p(string=c) => 字符串
[0xc42000e1d0 0xc42000e1d0 0xc42000e1d0]

据我了解,
我的变量v似乎是一个字符串,而不是指向字符串的指针。
因此v应该values1在迭代时复制。

显然我不正确,因为v仍然有相同的地址0xc42000e1d0。如果它不是指针,值
如何改变?v

如需快速解决方案,请使用:

values1 := []string{"a", "b", "c"}
var values2 []*string
for i, _ := range values1 {
    values2 = append(values2, &values1[i])
}

正确答案

第一个版本不起作用,因为只有一个循环变量, 每次迭代v都有相同的地址。循环变量在每次迭代中被赋值,它改变了它的值而不是它的地址,并且你在每次迭代中附加这个相同的地址。 ****

您提出了一个可能的解决方案:附加原始切片的正确切片元素的地址:

for i := range values1 {
    values2 = append(values2, &values1[i])
}

这可行,但请注意,它values2包含指向 的后备数组的地址values1,因此 的后备数组values1将保留在内存中(不会被垃圾收集),直到values1values2变量都无法访问。另请注意,修改元素 ofvalues1values2间接影响,因为元素 ofvalues2指向values1.

另一种解决方案是创建临时局部变量并附加它们的地址:

for _, v := range values1 {
    v2 := v
    values2 = append(values2, &v2)
}

通过这样做,您的values2切片将不会values1被垃圾收集,修改中的值values1也不会反映在 中values2,它们将是独立的。

请参阅有关循环变量的相关问题:

[为什么这两个 for 循环变体会给我不同的行为?](https://stackoverflow.com/questions/44715882/why- do-these-two-for-loop-variations-give-me-different-behavior/44716068#44716068)

[Golang:使用循环切片/地图的范围注册多个路由](https://stackoverflow.com/questions/44044245/golang- register-multiple-routes-using-range-for-loop-slices-map/44045012#44045012)

终于介绍完啦!小伙伴们,这篇关于《将字符串切片转换为指向字符串的指针切片》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>