Heim >Backend-Entwicklung >Golang >golang: ungültige Speicheradresse oder Null-Zeiger-Dereferenzierung

golang: ungültige Speicheradresse oder Null-Zeiger-Dereferenzierung

WBOY
WBOYnach vorne
2024-02-08 21:12:10903Durchsuche

golang: ungültige Speicheradresse oder Null-Zeiger-Dereferenzierung

Der PHP-Editor Xiaoxin ist hier, um eine häufige Fehlermeldung einzuführen: „golang: Ungültige Speicheradresse oder Nullzeiger-Dereferenzierung“. Bei der Entwicklung von Anwendungen mit der Programmiersprache Golang tritt dieser Fehler manchmal auf. Er weist normalerweise darauf hin, dass im Code eine ungültige Speicheradresse oder ein Nullzeiger dereferenziert wurde. Dieser Fehler kann zum Absturz des Programms oder zu unvorhersehbarem Verhalten führen. Als Nächstes werden wir einige häufige Ursachen und Lösungen untersuchen, die diesen Fehler verursachen können, um Entwicklern zu helfen, dieses Problem besser zu verstehen und zu lösen.

Frageninhalt

Führen Sie mich aus Jetzt habe ich ein Programm namens HelloWorld und die Projektstruktur ist

aaa.go

package aaa

import (
    "HelloWorld/test/bbb"
)

var aa = bbb.Bb

func World() {
    aa.Hello()
}

bbb.go

package bbb

import "HelloWorld/test/ccc"

var Bb *ccc.Config

ccc.go

package ccc

import "fmt"

type Config struct {
    C int
}

func ConfigInit() *Config {
    return &Config{C: 10}
}

func (c *Config) Hello() {
    fmt.Println(c.C)
}

main.go

package main

import (
    "HelloWorld/test/aaa"
    "HelloWorld/test/bbb"
    "HelloWorld/test/ccc"
)

func init() {
    bbb.Bb = ccc.ConfigInit()
}

func main() {

    aaa.World()
}

Wenn ich jetzt das Programm starte, wird es angezeigt panic: 运行时错误:无效的内存地址或 nil 指针取消引用

Aber als ich mich verändert habe main.go

import (
    "HelloWorld/test/bbb"
    "HelloWorld/test/ccc"
)

func init() {
    bbb.Bb = ccc.ConfigInit()
}

func main() {

    // aaa.World()
    var aa = bbb.Bb
    aa.Hello()
}

kann den korrekten Wert ausgeben10 Ich weiß nicht, warum die Definition in bbb.go中的定义var aa = bbb.Bbvar aa = bbb.Bb falsch ist

Ich verstehe nicht, warum es ein Nullzeiger ist

Problemumgehung

Wenn Sie sich das Bild oben ansehen, zeigt es den Import- und Variableninitialisierungsablauf. Nun, im ersten Fall aaa.world。 world 函数中的变量 nil 被设置为 nil ,因为即使在 main 中的 init 函数运行之前,一旦 init 运行 bb 就指向有效内存,但在此之前,包 bbb 中的 bb 从未被初始化。让我们考虑第二种情况,这里init函数也给了bb一个有效的内存,但这里的问题是aa被重新分配给bb,它指向有效的内存,分配后aa gilt das Gleiche.

Das obige ist der detaillierte Inhalt vongolang: ungültige Speicheradresse oder Null-Zeiger-Dereferenzierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen