golang面試題二之interface

interface和nil
golang的nil在概念上和其它語言的null婉烟、None、nil隅很、NULL一樣率碾,都指代零值或空值,在golang中芬膝,nil只能賦值給指針、channel仔粥、func、interface谭羔、map或slice類型的變量麦向。如果未遵循這個規(guī)則,則會引發(fā)panic.
在底層诵竭,interface作為兩個成員來實現(xiàn),一個類型和一個值.接下來通過編寫測試代碼來看看interface倒底是什么卵慰。
測試代碼一:

     package main  
       
    import (  
        "fmt"  
        "reflect"  
    )  
       
    func main() {  
        var val interface{} = int32(1)  
        fmt.Println(reflect.TypeOf(val))  
        val = 50  
        fmt.Println(reflect.TypeOf(val))  
    }  

我們已經(jīng)知道接口類型變量底層是作為兩個成員來實現(xiàn)裳朋,一個是type病线,一個是data鲤嫡。type用于存儲變量的動態(tài)類型,data用于存儲變量的具體數(shù)據(jù)让虐。在上面的例子中罢荡,第一條打印語句輸出的是:int32对扶。這是因為已經(jīng)顯示的將類型為int64的數(shù)據(jù)1賦值給了interface類型的變量val惭缰,所以val的底層結構應該是:(int32, 1)。我們暫且用這種二元組的方式來描述漱受,二元組的第一個成員為type,第二個成員為data昂羡。第二條打印語句輸出的是:int。這是因為字面量的整數(shù)在golang中默認的類型是int怨愤,所以這個時候val的底層結構就變成了:(int, 1)
在底層蛹批,interface作為兩個成員實現(xiàn),一個類型腐芍,一個值。只有在內部值和類型都設置為nil時设褐,interface才為nil埠对。特別的络断,一個nil接口總是擁有一個nil類型项玛。若我們在一個接口值中存儲一個int類型指針,則內部類型將為int锥惋,而無論該指針的值是什么:(*int,nil)开伏。因此這個接口值是非nil的,即使該指針值為nil。
看看測試代碼二:

package main  
import (  
 "fmt"  
)  
  func main() {  
  var val interface{} = nil  
  if val == nil {  
  fmt.Println("val is nil")  
  } else {  
  fmt.Println("val is not nil")  
  }  
}

變量val是interface類型固灵,它的底層結構必然是(type, data)。 由于nil是untyped(無類型)丛忆,又將nil賦值給了變量val,所以val實際上存儲的是(nil, nil)熄诡。
測試代碼三:

 package main  
 import (  
  "fmt"  
  )  
  func main() {  
      var val interface{} = (*interface{})(nil)   
      if val == nil {  
          fmt.Println("val is nil")  
      } else {  
           mt.Println("val is not nil") 
}

來看一種特例:(interface{})(nil)。將nil轉成interface類型的指針我抠,得到的結果僅僅是空接口類型指針并且它指向無效的地址袜茧。上面的代碼定義了接口指針類型變量val,它指向無效的地址(0x0)惫周,因此val持有無效的數(shù)據(jù)康栈。但它是有類型的(interface{})。所以val的底層結構應該是:(interface{}, nil)啥么。很顯然,無論該指針的值是什么:(interface{}, nil)菠秒,這樣的接口值總是非nil的氯迂,即使在該指針的內部為nil。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末禁灼,一起剝皮案震驚了整個濱河市轿曙,隨后出現(xiàn)的幾起案子弄捕,更是在濱河造成了極大的恐慌导帝,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斋荞,死亡現(xiàn)場離奇詭異虐秦,居然都是意外死亡讯檐,警方通過查閱死者的電腦和手機染服,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挖垛,“玉大人秉颗,你說我怎么就攤上這事〔仙” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵凭舶,是天一觀的道長爱沟。 經(jīng)常有香客問我,道長呼伸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任搂根,我火速辦了婚禮铃辖,結果婚禮上,老公的妹妹穿的比我還像新娘澳叉。我一直安慰自己,他們只是感情好五督,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布瓶殃。 她就那樣靜靜地躺著,像睡著了一般基矮。 火紅的嫁衣襯著肌膚如雪淆储。 梳的紋絲不亂的頭發(fā)上家浇,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天钢悲,我揣著相機與錄音点额,去河邊找鬼莺琳。 笑死,一個胖子當著我的面吹牛珍手,可吹牛的內容都是我干的辞做。 我是一名探鬼主播琳要,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼焙蹭,長吁一口氣:“原來是場噩夢啊……” “哼嫂伞!你這毒婦竟也來了拯钻?” 一聲冷哼從身側響起帖努,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤拼余,失蹤者是張志新(化名)和其女友劉穎亩歹,沒想到半個月后匙监,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體小作,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡顾稀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了粮揉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡扶认,死狀恐怖,靈堂內的尸體忽然破棺而出阳谍,到底是詐尸還是另有隱情,我是刑警寧澤矫夯,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布吊洼,位于F島的核電站,受9級特大地震影響递沪,放射性物質發(fā)生泄漏。R本人自食惡果不足惜款慨,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一谬莹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧附帽,春花似錦、人聲如沸整胃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奔则。三九已至,卻和暖如春应狱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背除嘹。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留尉咕,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓悔捶,卻偏偏與公主長得像单芜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子洲鸠,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內容