arrays - 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 指针取消引用。
解决方案
在 init 做*s.A =
的地方,它取消引用一个 nil 指针。s.A
此时尚未初始化(即,它是nil
),并且*
是取消引用运算符。但这只是一个问题,因为它首先是不必要的复杂。它应该只是:
func (s Srv) init() {
s.A = make([][]int, 0)
}
推荐阅读
- django - Django 模型继承:如何检索记录?
- java - 具有非质数检查的金字塔中的最大汇总路径
- sql - sql - 如何使用单独的逗号对列进行分组
- azure-devops - 如果 A 的管道状态在 azure devops 中为警告,则管道 B 不会从另一个管道 A 触发
- java - 读取 jar 文件中的 xslt
- ssl - SSL 证书适用于子域,但不适用于使用 cloudflare 和 certbot 的主域
- vba - 更改 Solidworks 零件上的文本
- python - 可视化值分布不均匀的两个数据集的共享正常运行时间
- css - 如何将 alpha 值添加到 css 中的变量?
- c++ - 如何将类的成员函数传递给线程?