【问题标题】:Nil pointer dereference even with initializationNil 指针取消引用,即使有初始化
【发布时间】:2019-10-28 11:40:15
【问题描述】:

我的目标是声明一个空的二维数组,然后在每次 do() 运行时对其进行初始化并填充值。问题是即使我正在初始化数组,我也会得到一个 nil 指针取消引用。

这是我试图在服务器模拟器上完成的一个简单版本。

package main

import "fmt"


type Srv struct {
    A *[][]int
}

func (s Srv) init() {
    arr := make([][]int, 0)
    *s.A = arr
}

func main() {
    s := Srv{nil}
    s.init()
    printSlice(*s.A)
    do(s.A)
    do(s.A)


}

func printSlice(s [][]int) {
    fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}

func do(s *[][]int) {
    *s = append(*s, make([]int, 0))
    printSlice(*s)

    (*s)[0] = append((*s)[0], 5)
    (*s)[0] = append((*s)[0], 6)

    *s = append(*s, make([]int, 0))
    printSlice(*s)
}

我希望得到类似 [ [5 6 5 6] [] [] [] ] 的输出,但我得到的是 nil 指针取消引用。

【问题讨论】:

  • s.Anil,您不能取消引用 nil

标签: arrays pointers go


【解决方案1】:

init 在 *s.A = 的地方,它取消引用一个 nil 指针。 s.A 在此时尚未初始化(即,它是 nil),* 是取消引用运算符。但这只是一个问题,因为它首先是不必要的复杂。它应该是:

func (s Srv) init() {
    s.A = make([][]int, 0)
}

【讨论】:

  • 那会去哪里?我将 A 设为指针,因为 do() 不会永久更改 A
猜你喜欢
  • 1970-01-01
  • 2020-01-15
  • 2021-03-12
  • 2020-11-10
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 2016-02-03
相关资源
最近更新 更多