golang: alamat ingatan tidak sah atau penolakan penunjuk nil

WBOY
Lepaskan: 2024-02-08 21:12:10
ke hadapan
803 orang telah melayarinya

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()
}
Salin selepas log masuk

bbb.go

package bbb

import "HelloWorld/test/ccc"

var Bb *ccc.Config
Salin selepas log masuk

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)
}
Salin selepas log masuk

main.go

package main

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

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

func main() {

    aaa.World()
}
Salin selepas log masuk

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()
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!