【问题标题】:How can I append to an array identified by a pointer如何附加到由指针标识的数组
【发布时间】:2019-01-10 00:54:17
【问题描述】:

以下代码段错误 - 应该如何表达?

package main

func main() {
    var a *[]int
    *a = make([]int, 0)
    *a = append(*a, 1)
}

【问题讨论】:

  • 顺便说一句,您的代码中没有明确的数组,只是切片。
  • 简而言之:a的值为nil。所有指针的默认值为nil。在函数main 的第二行,您正在取消引用nil

标签: arrays pointers go slice


【解决方案1】:

使您的指针示例工作

声明后,您的指针变量将为nil,,因此您无法设置指向的值(它还没有指向任何地方)。

您必须首先为指向的值分配内存,例如使用内置的new() 函数:

var a *[]int
a = new([]int)
*a = make([]int, 0)
*a = append(*a, 1)

另一种选择是使用切片composite literal,并获取其地址:

var a *[]int
a = &[]int{}
*a = make([]int, 0)
*a = append(*a, 1)

另一种选择是使用另一个切片类型的变量[]int,并将其地址分配给a

var a *[]int
var b []int
a = &b
*a = make([]int, 0)
*a = append(*a, 1)

放弃指针

但是要知道使用切片不需要指针。您可以将make() 的返回值分配给非指针切片变量:

var a []int
a = make([]int, 0)
a = append(a, 1)

【讨论】:

  • 你把我弄糊涂了。 make 不是分配内存并因此将其分配给 *a 吗?如果 a 是每个声明的指针,为什么 a=new([]..) 即使返回数组而不是指针也能工作?
  • @andig make() 分配了一个切片,但 a 是一个指针,不指向任何地方。您不能对a 指向的内存设置任何内容,因为它指向任何地方。问题不在于make(),问题在于您试图为nil 指针指向的“某物”分配一个值。
  • 依然眼花缭乱。在任何其他语言中,我希望 a 在分配完成时指向 make 的结果。相反,似乎我需要为 a 分配内存,然后 make 覆盖该位置的内存?
  • @andig 在这种情况下,您甚至根本不使用指针。我刚刚使您的初始代码正常工作。您应该将make() 的返回值分配给非指针值。
  • @andig []int 是一个切片,而不是一个数组。这些在 Go 中是不同的东西。切片只是指向实际数组的固定大小的小标题。如果您不知道其中的区别,请阅读这篇博文:Go Slices: usage and internals
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 2018-04-10
  • 2021-12-19
  • 2020-06-17
  • 2017-08-11
相关资源
最近更新 更多