登录
首页 >  Golang >  Go问答

即使初始化,零指针也会取消引用

来源:stackoverflow

时间:2024-03-29 13:38:02 455浏览 收藏

最近发现不少小伙伴都对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)
}

今天关于《即使初始化,零指针也会取消引用》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>