我想将字符串切片转换为指向字符串的指针切片
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
将保留在内存中(不会收集垃圾),直到values1
和values2
变量均不可访问。另请注意,由于的元素指向的元素,因此修改的元素values1
将values2
间接影响。values2``values1
另一种解决方案是创建临时局部变量,并附加这些变量的地址:
for _, v := range values1 {
v2 := v
values2 = append(values2, &v2)
}
这样,您的分values2
片将无法values1
避免收集垃圾,也values1
不会修改中的值values2
,它们将是独立的。
主要内容:到底使用字符数组还是字符串常量C语言中没有特定的字符串类型,我们通常是将字符串放在一个字符数组中,这在《 C语言字符数组和字符串》中已经进行了详细讲解,这里不妨再来演示一下: 运行结果: https://www.xnip.cn https://www.xnip.cn 字符数组归根结底还是一个数组,上节讲到的关于 指针和数组的规则同样也适用于字符数组。更改上面的代码,使用指针的方式来输出字符串: 运行结果: https://ww
问题内容: 我刚开始使用Go,所以这很明显。编译器不允许以下代码:(http://play.golang.org/p/3sTLguUG3l) 错误是: 从规格上看,[] string看起来与[] Card不是相同的基础类型,因此无法进行类型转换。 确实是这样,还是我错过了什么? 如果是这样,为什么会这样呢?假设在一个非宠物示例程序中,我输入了一个字符串切片,是否可以将其“投射”到Card切片中,或
问题内容: 例如输入:(类型:) 转换示例:(类型:的切片) 问题答案: 除了mhutter的答案外,还请注意您的输入看起来像一个JSON数组(也许是来自JSON文本?)。 如果您这样处理,则可以将其内容编组为一个切片。直接解析其中的数字并不会更快(因为该包使用了反射),但是它肯定更简单: 输出(在Go Playground上尝试):
问题内容: 我正在使用Swift 3,并且需要与C API进行交互,例如,C API接受以NULL终止的字符串列表 在Swift中,API的导入方式如下 在尝试使用类型转换数百次后,我还是无法完成这项工作。即使我传递通过编译的有效指针,它也会在运行时崩溃,提示无效的内存访问(在strlen函数中)。还是关于ARC的东西? 问题答案: 您可以像如何通过使用char **参数将Swift字符串数组传递
问题内容: 如何将类型中的字符串指针的引用值设置为空字符串?考虑以下示例: 我尝试了和运算符的所有组合都无济于事: 显然其中一些很愚蠢,但我没有发现尝试的危害。我也尝试使用和: 这会导致编译错误 恐慌:反映:使用不可寻址的值reflect.Value.SetString 我假设这是因为Go中的字符串是不可变的? 问题答案: 字符串文字不可寻址。 取包含空字符串的变量的地址: 或使用新的:
值得注意点的是切片的本质就是一个指针指向数组,所以指向切片的指针是一个二级指针 package main import "fmt" func main() { // 1.定义一个切片 var sce[]int = []int{1, 3, 5} // 2.打印切片的地址 // 切片变量中保存的地址, 也就是指向的那个数组的地址 sce = 0xc0420620a0 f