W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
什么?nil是一種數(shù)據(jù)結(jié)構(gòu)么?為什么會講到它,沒搞錯(cuò)吧?沒搞錯(cuò)。不僅僅是Go語言中,每門語言中nil都是非常重要的,它代表的是空值的語義。
在不同語言中,表示空這個(gè)概念都有細(xì)微不同。比如在scheme語言(一種lisp方言)中,nil是true的!而在ruby語言中,一切都是對象,連nil也是一個(gè)對象!在C中NULL跟0是等價(jià)的。
按照Go語言規(guī)范,任何類型在未初始化時(shí)都對應(yīng)一個(gè)零值:布爾類型是false,整型是0,字符串是"",而指針,函數(shù),interface,slice,channel和map的零值都是nil。
一個(gè)interface在沒有進(jìn)行初始化時(shí),對應(yīng)的值是nil。也就是說var v interface{}
,
此時(shí)v就是一個(gè)nil。在底層存儲上,它是一個(gè)空指針。與之不同的情況是,interface值為空。比如:
var v *T
var i interface{}
i = v
此時(shí)i是一個(gè)interface,它的值是nil,但它自身不為nil。
Go中的error其實(shí)就是一個(gè)實(shí)現(xiàn)了Error方法的接口:
type error interface {
Error() string
}
因此,我們可以自定義一個(gè)error:
type Error struct {
errCode uint8
}
func (e *Error) Error() string {
switch e.errCode {
case 1:
return "file not found"
case 2:
return "time out"
case 3:
return "permission denied"
default:
return "unknown error"
}
}
如果我們這樣使用它:
func checkError(err error) {
if err != nil {
panic(err)
}
}
var e *Error
checkError(e)
e是nil的,但是當(dāng)我們checkError時(shí)就會panic。請讀者思考一下為什么?
總之,interface跟C語言的指針一樣非常靈活,關(guān)于空的語義,也跟空指針一樣容易困擾新手的,需要注意。
string的空值是"",它是不能跟nil比較的。即使是空的string,它的大小也是兩個(gè)機(jī)器字長的。slice也類似,它的空值并不是一個(gè)空指針,而是結(jié)構(gòu)體中的指針域?yàn)榭?,空的slice的大小也是三個(gè)機(jī)器字長的。
channel跟string或slice有些不同,它在棧上只是一個(gè)指針,實(shí)際的數(shù)據(jù)都是由指針?biāo)赶虻亩焉厦妗?/p>
跟channel相關(guān)的操作有:初始化/讀/寫/關(guān)閉。channel未初始化值就是nil,未初始化的channel是不能使用的。下面是一些操作規(guī)則:
map也是指針,實(shí)際數(shù)據(jù)在堆中,未初始化的值是nil。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: