首頁 >後端開發 >Golang >golang:無效的記憶體位址或零指標取消引用

golang:無效的記憶體位址或零指標取消引用

WBOY
WBOY轉載
2024-02-08 21:12:10887瀏覽

golang:無效的記憶體位址或零指標取消引用

php小編小新在這裡為大家介紹一個常見的錯誤提示:"golang:無效的記憶體位址或零指標取消引用」。在使用Golang程式語言開發應用程式時,有時會遇到這個錯誤,它通常表示在程式碼中對一個無效的記憶體位址或零指標進行了取消引用操作。這個錯誤可能會導致程式崩潰或產生不可預測的行為。接下來,我們將探討一些可能導致這個錯誤的常見原因和解決方法,幫助開發者更好地理解並解決這個問題。

問題內容

處死我 現在我有一個名為 HelloWorld 的程序,專案結構是

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

現在,當我執行程式時,它將出現 panic: 運行時錯誤:無效的記憶體位址或 nil 指標取消引用

#但是當我更改 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()
}

可以輸出正確的值10 我不知道為什麼bbb.go中的定義var aa = bbb.Bb不正確

我不明白為什麼它是空指標

解決方法

如果你看上圖,它顯示了導入和變數初始化流程。現在,在第一種情況下 aaa.world。 world 函數中的變數nil 被設定為nil ,因為即使在main 中的init 函數運行之前,一旦init 運行bb 就指向有效內存,但在此之前,套件bbb 中的bb 從未被初始化。讓我們考慮第二種情況,這裡init函數也給了bb一個有效的內存,但這裡的問題是aa被重新分配給bb,它指向有效的內存,分配後aa 也是如此。

以上是golang:無效的記憶體位址或零指標取消引用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除