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

WBOY
Freigeben: 2024-02-08 21:12:10
nach vorne
802 Leute haben es durchsucht

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()
}
Nach dem Login kopieren

bbb.go

package bbb

import "HelloWorld/test/ccc"

var Bb *ccc.Config
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

main.go

package main

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

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

func main() {

    aaa.World()
}
Nach dem Login kopieren

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()
}
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!