<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
今天筆試題遇到 var x string = nil
,問這個定義是否正確?
這裡給出答案:
cannot use nil as string value in variable declaration。
也就是說,string
型別和nil
八竿子打不著,要想判斷字串是否為空,可以使用str == ""
或者len(str) == 0
。
接下來,順便總結一下nil的使用
nil
是go語言中預先定義的識別符號,不是關鍵字或保留字。 我們可以直接使用nil
,而不用宣告它。 而且我們可以定義一個名稱為 nil
的變數,比如下面這樣:
var nil = errors.New("nil") fmt.Printf("%#vn", nil)//&errors.errorString{s:"nil"}
雖然上面的宣告語句可以通過編譯,但是並不提倡這麼做。
在go語言中:
false
0
""
除此之外其它型別的預設值為nil
,nil
可以代表下面這些型別的零值:
unsafe
中的)map
型別slice
型別function
型別channel
型別interface
型別預先定義的nil
是唯一的一個go語言中沒有預設型別的非型別值。對於編譯器來說,必須從上下文中獲取充足的資訊才能推斷出nil
的型別。
當你把nil
賦值給一個channel
型別變數,此時為channel
型別。
當你把nil
賦值給map
型別變數,此時為map
型別。
一個型別的所有的值的記憶體佈局都是一樣的。nil也不例外。nil的大小一致與同型別中的非nil型別的值的大小一樣大。但是不同型別的nil值的大小可能不同.
package main import ( "fmt" "unsafe" ) func main() { var p *struct{} = nil fmt.Println(unsafe.Sizeof(p)) // 8 var s []int = nil fmt.Println(unsafe.Sizeof(s)) // 24 var m map[int]bool = nil fmt.Println(unsafe.Sizeof(m)) // 8 var c chan string = nil fmt.Println(unsafe.Sizeof(c)) // 8 var f func() = nil fmt.Println(unsafe.Sizeof(f)) // 8 var i interface{} = nil fmt.Println(unsafe.Sizeof(i)) // 16 }
//不同型別的nil指標是一樣的 package main import ( "fmt" ) func main() { var arr []int var num *int fmt.Printf("%pn", arr) //0x0 fmt.Printf("%p", num) //0x0 }
通過執行結果可以看出 arr 和 num 的指標都是 0x0。
兩個相同型別的 nil 值也無法比較
在Go語言中 map、slice 和 function 型別的 nil 值不能比較,比較兩個無法比較型別的值是非法的,下面的語句無法編譯。
但可以將不可比較型別的空值直接與 nil 識別符號進行比較
//兩個相同型別的 nil 值也無法比較 package main import ( "fmt" ) func main() { var s1 []int var s2 []int fmt.Printf(s1 == s2) //invalid operation: s1 == s2 (slice can only be compared to nil) var s3 = []int{1} var s4 = []int{1} var s5 []int copy(s5, s3) fmt.Printf(s3 == s4) //invalid operation: s3 == s4 (slice can only be compared to nil) fmt.Printf(s3 == s5) //invalid operation: s3 == s5 (slice can only be compared to nil) }
對nil channel,map,slice和array 指標進行range操作也是合法的。
例如,下面的程式碼將列印0,1,2,3和4,然後永遠阻塞。hello, world和bye將永遠不會被列印
//對nil channel,map,slice和array 指標進行range操作也是合法的 package main import "fmt" func main() { for range []int(nil) { //迴圈次數將是0 fmt.Println("Hello") } for range map[string]string(nil) { //迴圈次數將是0 fmt.Println("world") } for i := range (*[5]int)(nil) { fmt.Println(i) // 0 1 2 3 4 } for range chan bool(nil) { // block here fmt.Println("Bye") //fatal error: all goroutines are asleep - deadlock! } }
如果型別T的零值是用預先定義的nil來表示的話,*new(T)產生一個nil T型別的值
//如果型別T的零值是用預先定義的nil來表示的話,*new(T)產生一個nil T型別的值 package main import "fmt" func main() { fmt.Println(*new(*int) == nil) // true fmt.Println(*new([]int) == nil) // true fmt.Println(*new(map[int]bool) == nil) // true fmt.Println(*new(chan string) == nil) // true fmt.Println(*new(func()) == nil) // true fmt.Println(*new(interface{}) == nil) // true }
new()返回是一個指向新分配記憶體的地址,*可以對地址取值。
以上就是go語言 nil使用避坑指南的詳細內容,更多關於go語言 nil避坑的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45