最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《即使初始化,零指针也会取消引用》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~
问题内容我的目标是声明一个空的二维数组,然后初始化该数组,然后在每次 do() 运行时填充值。问题是,即使我正在初始化数组,我也会得到一个零指针取消引用。
这是我试图在服务器模拟器上完成的简单版本。
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)
}
今天关于《即使初始化,零指针也会取消引用》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注编程网公众号!