Обращение по нулевому указателю даже при инициализации - PullRequest
0 голосов
/ 13 июня 2019

Моя цель - объявить пустой 2D-массив, который затем инициализируется и затем заполняется значениями при каждом запуске 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] [] [] []], но вместо этого получаю разыменование нулевого указателя.

1 Ответ

1 голос
/ 13 июня 2019

Где init делает *s.A =, это разыменование нулевого указателя. s.A еще не инициализирован в этот момент (т. Е. nil), а * является оператором разыменования. Но это только проблема, потому что это излишне сложно во-первых. Это должно быть просто:

func (s Srv) init() {
    s.A = make([][]int, 0)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...