Maison > développement back-end > Golang > golang : adresse mémoire invalide ou déréférencement de pointeur nul

golang : adresse mémoire invalide ou déréférencement de pointeur nul

WBOY
Libérer: 2024-02-08 21:12:10
avant
856 Les gens l'ont consulté

golang : adresse mémoire invalide ou déréférencement de pointeur nul

L'éditeur php Xiaoxin est là pour introduire un message d'erreur courant : "golang : adresse mémoire invalide ou déréférencement de pointeur zéro". Lors du développement d'applications à l'aide du langage de programmation Golang, vous rencontrez parfois cette erreur. Elle indique généralement qu'une adresse mémoire non valide ou un pointeur zéro est déréférencé dans le code. Cette erreur peut provoquer le blocage du programme ou produire un comportement imprévisible. Ensuite, nous explorerons certaines causes courantes et solutions pouvant provoquer cette erreur pour aider les développeurs à mieux comprendre et résoudre ce problème.

Contenu de la question

Exécutez-moi Maintenant, j'ai un programme appelé HelloWorld et la structure du projet est

aaa.go

package aaa

import (
    "HelloWorld/test/bbb"
)

var aa = bbb.Bb

func World() {
    aa.Hello()
}
Copier après la connexion

bbb.go

package bbb

import "HelloWorld/test/ccc"

var Bb *ccc.Config
Copier après la connexion

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)
}
Copier après la connexion

main.go

package main

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

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

func main() {

    aaa.World()
}
Copier après la connexion

Maintenant, lorsque j'exécuterai le programme, il apparaîtra panic: 运行时错误:无效的内存地址或 nil 指针取消引用

Mais quand je change 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()
}
Copier après la connexion

peut afficher la valeur correcte10 Je ne sais pas pourquoi la définition dans bbb.go中的定义var aa = bbb.Bbvar aa = bbb.Bb est incorrecte

Je ne comprends pas pourquoi il s'agit d'un pointeur nul

Solution de contournement

Si vous regardez l'image ci-dessus, elle montre le flux d'importation et d'initialisation des variables. Maintenant, dans le premier cas aaa.world。 world 函数中的变量 nil 被设置为 nil ,因为即使在 main 中的 init 函数运行之前,一旦 init 运行 bb 就指向有效内存,但在此之前,包 bbb 中的 bb 从未被初始化。让我们考虑第二种情况,这里init函数也给了bb一个有效的内存,但这里的问题是aa被重新分配给bb,它指向有效的内存,分配后aa c’est la même chose.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal