Rumah  >  Artikel  >  pembangunan bahagian belakang  >  golang: alamat ingatan tidak sah atau penolakan penunjuk nil

golang: alamat ingatan tidak sah atau penolakan penunjuk nil

WBOY
WBOYke hadapan
2024-02-08 21:12:10806semak imbas

golang: alamat ingatan tidak sah atau penolakan penunjuk nil

Editor php Xiaoxin berada di sini untuk memperkenalkan mesej ralat biasa: "golang: Alamat memori tidak sah atau penolakan penunjuk sifar". Apabila membangunkan aplikasi menggunakan bahasa pengaturcaraan Golang, anda kadangkala menghadapi ralat ini Ia biasanya menunjukkan bahawa alamat memori yang tidak sah atau penuding sifar dinyahrujuk dalam kod. Ralat ini boleh menyebabkan program ranap atau menghasilkan tingkah laku yang tidak dapat diramalkan. Seterusnya, kami akan meneroka beberapa punca dan penyelesaian biasa yang mungkin menyebabkan ralat ini untuk membantu pembangun lebih memahami dan menyelesaikan masalah ini.

Isi soalan

Laksanakan saya Sekarang saya mempunyai program yang dipanggil HelloWorld dan struktur projek adalah

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

Sekarang apabila saya menjalankan program ia akan muncul panic: 运行时错误:无效的内存地址或 nil 指针取消引用

Tapi bila dah berubah 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()
}

boleh keluarkan nilai yang betul10 Saya tidak tahu mengapa takrifan dalam bbb.go中的定义var aa = bbb.Bbvar aa = bbb.Bb tidak betul

Saya tidak faham mengapa ia adalah penunjuk nol

Penyelesaian

Jika anda melihat gambar di atas, ia menunjukkan aliran permulaan import dan pembolehubah. Sekarang, dalam kes pertama aaa.world。 world 函数中的变量 nil 被设置为 nil ,因为即使在 main 中的 init 函数运行之前,一旦 init 运行 bb 就指向有效内存,但在此之前,包 bbb 中的 bb 从未被初始化。让我们考虑第二种情况,这里init函数也给了bb一个有效的内存,但这里的问题是aa被重新分配给bb,它指向有效的内存,分配后aa perkara yang sama adalah benar.

Atas ialah kandungan terperinci golang: alamat ingatan tidak sah atau penolakan penunjuk nil. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam