go語言nil 問題?

2021-08-21 20:26:24 字數 762 閱讀 9194

golang 這段** checkerror 為什麼會觸發 panic ?

package main

import (

"fmt"

)type error struct

func (e *error) error() string

}func checkerror(err error)

}func main()

解答:

首先在main函式裡的

var e *error

這裡的e是乙個error型別的指標,而指標的自動初始化為nil,在這裡e的確是nil沒有錯,e==nil。

但是當你把e傳入進checkerror函式時,發生了變化,因為接受的形參是個error介面型別,所以形參err是乙個介面值,而乙個介面值實際上是包含了實際值和動態型別兩個部分的。

err這個介面值大概是這樣的(nil,*error),這裡後面的部分*error表示它的動態型別。

你把err和外面的e做比較時,因為介面型別會斷言,所以會相等,err==e。

但是你把err和nil做比較時,nil實際上是(nil,nil)這種,比較結果自然是false err!=nil

你把nil用顯示型別轉換一下,變成了(nil,*error)後就和err相同了, err==(*error)(nil)

總而言之,就是你把乙個擁有實際型別的指標傳給了介面,那麼這個介面值永遠不可能是nil。

golang這個設計是因為介面值持有的型別必須是動態的。

Go語言中nil的理解

現在對於golang語言的介紹比較少,寫一點自己對於nil的理解。首先,我們取源 中看一下創始人是怎麼定義的nil 翻譯如下 nil是乙個預先宣告的識別符號,表示指標 通道 函式 介面 對映或切片型別。因此,我們可以知道nil只能表示指標 通道 函式 介面 對映或切片nil是go語言中預先的識別符號...

部落格351 Go的 「nil「

內容 記錄go中的nil,其實跟c c 中的null並不一樣 go中的nil 零值在go語言中 布林型別的 0 初始值 為false 數值型別的 0 為0 字串型別的 0 為空字串 而指標 切片 對映 通道 函式和介面的 0 即為nil。結構體的零值與成員屬性有關例子 當你宣告乙個結構體變數並未初始...

1 26 Go介面的nil判斷

示例 package main import fmt 定義乙個介面 type student inte ce 定義乙個型別 type stu struct 該型別實現showinfor函式 func s stu showinfor string 定義乙個函式,返回該介面型別 func getstud...