国产gaysexchina男同gay,japanrcep老熟妇乱子伦视频,吃奶呻吟打开双腿做受动态图,成人色网站,国产av一区二区三区最新精品

Go語言 nil的介紹

2018-07-25 17:23 更新

nil的語義

什么?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。

interface

一個(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和slice

string的空值是"",它是不能跟nil比較的。即使是空的string,它的大小也是兩個(gè)機(jī)器字長的。slice也類似,它的空值并不是一個(gè)空指針,而是結(jié)構(gòu)體中的指針域?yàn)榭?,空的slice的大小也是三個(gè)機(jī)器字長的。

channel和map

channel跟string或slice有些不同,它在棧上只是一個(gè)指針,實(shí)際的數(shù)據(jù)都是由指針?biāo)赶虻亩焉厦妗?/p>

跟channel相關(guān)的操作有:初始化/讀/寫/關(guān)閉。channel未初始化值就是nil,未初始化的channel是不能使用的。下面是一些操作規(guī)則:

  • 讀或者寫一個(gè)nil的channel的操作會永遠(yuǎn)阻塞。
  • 讀一個(gè)關(guān)閉的channel會立刻返回一個(gè)channel元素類型的零值。
  • 寫一個(gè)關(guān)閉的channel會導(dǎo)致panic。

map也是指針,實(shí)際數(shù)據(jù)在堆中,未初始化的值是nil。

links


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號