Golang語言如何避免空指標引發的panic詳解

2022-09-20 12:45:12 字數 1827 閱讀 8879

目錄

在 golang 語言專案開發中,變數操作不當就會觸發空指標引發程式 panic。空指標就是未分配記憶體的指標型別的變數,變數的值是 nil,因為操作空指標會引發 panic,所以我們在程式開發中要特別小心。

在呼叫結構體指標型別返回值的函式或方法時,並且需要操作返回值的字段或方法,此時,我們就需要注意觸發空指標引發的 panic。

操作返回值的字段:

func main()

func getuser() (user *user)

type user struct

閱讀上面這段**,我們通過呼叫函式 getuser() 獲取 *user 型別的返回值,因為返回值變數是空指標,當我們訪問返回值的字段時,程式引發 panic。

避免此類空指標問題,一是可以在返回值包含指標型別變數的函式或方法中,在函式體開頭初始化返回值的指標型別變數;二www.cppcns.com是在呼叫結構體指標型別返回值的函式或方法時,在操作返回值的字段或方法時,先判定返回值是否為 nil(空指標)。

func main()

}func getuser() (u程式設計客棧ser *user)

return

}type user struct

操作返回值的方法:

func main()

func getuser() (user *user)

type user struct

func (u user) login()

閱讀上面這段**,我們通過呼叫函式 getuser() 獲取 *user 型別的返回值,因為返回值變數是空指標,當我們訪問返回值的方法 login() 時,程式觸發空指標引發 panic。

避免此類空指標問題,一是可以在返回值是指標型別變數的函式或方法的函式體中,開頭先初始化返回值的指標型別變數;二是型別方法的接收者使用指標型別。

func main()

func getuser() (user *user)

return

}type user struct

func (u *user) login()

在 golang 語言程式開發中,經常會操作結構體指標型別 value 的 map,也需要注意觸發空指標引發 panic。

func main()

type user struct

閱讀上面這段**,我們定義 map 型別的變數 userdata,key 是 int 型別,value 是結構體指標型別,我們訪問 map 的值時,因為值是空指標,所以會引發 panic。

避免此類空指標問題,我們可以使用 ok-idiom 模式判斷鍵值是否存在,如果鍵值存在(判斷鍵值是否為 nil),我們訪程式設計客棧問鍵值的字段,否則不訪問。通過這種方式,也可以避免觸發空指標引發 panic。

func main()

}type user struct

關鍵字 defer 延遲呼叫函式,雖然被呼叫函式會延遲呼叫,但是被呼叫函式的變數會先被註冊。所以,如果被呼叫函式的變數是空指標,就會引發 panic。

func main()

body, err := io.readall(res.body)

if err != nil

fmt.printf("%s", body)

}閱讀上面這段**,使用 defer 延遲呼叫函式釋放資源,因為我們將 defer 放在錯誤檢查之後,所以如果返回值 res 是空指標,就會引發 panic。

避免此類空指標問題,我們可以在使用 defer 呼叫之前,先做錯誤檢查,並且遇到錯誤後停止向下執行。

本文我們介紹一些 golang 語言開發需要避免空指標引發 panic 的場景,雖然都比較簡單,但是新手很容易踩「坑」。

golang定義空指標 Go語言指標宣告及操作方法

指標 pointer 是程式語言中的乙個物件,利用位址,它的值直接指向 points to 存在電腦儲存器中另乙個地方的值。由於通過位址能找到所需的變數單元,可以說,位址指向該變數單元。因此,將位址形象化的稱為 指標 意思是通過它能找到以它為位址的記憶體單元。乙個指標變數指向了乙個值的記憶體位址。g...

C語言中如何避免野指標

先看乙個例子 struct student stu,pstu intmain void 這是很多人都容易犯的錯誤 定義了結構體變數stu,但結構體內部的char name在定義結構體時只是為其分配了4位元組的記憶體,沒有指向乙個合法的位址,這時其指標指向的區域只是一些亂碼,有事還沒有訪問許可權。這就...

如何避免野指標?

野指標是指隨機訪問了記憶體空間,歸根到底是由於不良的編碼習慣,有個良好的程式設計習慣是避免 野指標 的唯一方法。如何避免野指標 1 初始化 char p null 為何賦值為 null 一是null 是乙個巨集,高亮,檢查段錯誤的時候比較顯眼。二是 null 為值,不能對 null 值賦值或者訪問。...