首页 > 解决方案 > Nil 指针取消引用,即使有初始化

问题描述

我的目标是声明一个空的二维数组,然后在每次 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 指针取消引用。

标签: arrayspointersgo

解决方案


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

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

推荐阅读