Maison  >  Article  >  développement back-end  >  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
WBOYavant
2024-02-08 21:12:10806parcourir

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()
}

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()
}

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()
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer