部落格351 Go的 「nil「

2021-10-08 11:03:14 字數 1791 閱讀 6888

內容:記錄go中的nil,其實跟c/c++中的null並不一樣

go中的nil:

零值在go語言中:

* 布林型別的"0"(初始值)為false

* 數值型別的"0"為0

* 字串型別的"0"為空字串""

* 而指標/切片/對映/通道/函式和介面的"0"即為nil。

* 結構體的零值與成員屬性有關

例子:

當你宣告乙個結構體變數並未初始化時,該結構體所有的域(field)都為"0"(初始值):

type person struct

var jon person --

----

->

nil並不是關鍵字:

nil不是關鍵字(keyword):

比如:下面的語句可以通過編譯,但是後續這個變數會隱藏空值nil的用法

var nil = errors.

new(

"oh my god !!"

)

nil的意義:

1、當變數的型別為指標時,nil表示該指標不指向任何值,即不能從指標中取值

2、當變數的型別為切片時,nil表示該切片沒有backing array),即切片的長度和容量都為0,

系統沒有為該切片分配儲存空間。

3、當變數的型別為對映/通道/函式時,nil表示該變數未初始化;

* 未初始化的對映只能讀不能寫

* 未初始化的通道只能讀不能寫,且讀會造正阻塞

* 未初始化的函式不能被呼叫

4、當變數的型別為介面時,nil表示該變數沒有值,也不能是乙個空指標。

* 介面由兩部分組成,一部分是型別,另一部分是值;

* 只有當型別和值都為nil時,該變數才等於nil。

nil型別的所有值的記憶體布局始終相同,不同型別nil的記憶體位址是一樣的
package main

import (

"fmt"

)func main()

nil值的大小始終與其型別與nil值相同的non-nil值大小相同。表示不同零值的nil識別符號可能

具有不同的大小。

package main

import (

"fmt"

"unsafe"

)func main()

= nil

fmt.

println

( unsafe.

sizeof

( p )

) var s [

]int

= nil

fmt.

println

( unsafe.

sizeof

( s )

)

nil值的比較:

1、不同型別的nil是不能比較的

2、同一型別的兩個nil值可能無法比較 因為golang中存在map、slice和函式型別是不

可比較型別,它們有乙個別稱為不可比擬的型別,所以比較它們的nil亦是非法的

其它細節還有待細細品味!

UOJ 351 新年的葉子

給出一棵樹,每次隨機選擇乙個葉子節點 可以重複選 將其染黑,問樹上不經過黑點的最長鏈變短的期望染色次數是多少。這題的主要思路是用總代價除以總方案數。樹的直徑有乙個或兩個必經點,當直徑長度為奇數時,直徑的中點即為必經點,可以將有希望成為直徑上的葉子節點根據它屬於必經點的哪棵子樹進行分類,得到多個葉子集...

UOJ 351 新年的葉子

試題描述 躲過了alphago 之後,你躲在 singledog 的長毛裡,和它們一起來到了alphago 的家。此時你們才突然發現,alphago 的家居然是乙個隱藏在地下的計算中心!難道 alphago 如此人贏的秘密是.它其實是乙個 ai?根據情報,這個地下的計算中心的結構構成了一棵無根樹,整...

(35 1)派生類的建構函式

建構函式和類的名字是一致的 派生類名 形式引數列表 基類名 基類建構函式實參列表 派生類初始化列表 class point 建構函式 class rect public point 派生類建構函式 類名 形式引數列表 子物件名 子物件建構函式實參列表 類初始化列表 classa a類沒有建構函式,系...