1. 程式人生 > GO語言入門 >34 Go 語言中的 nil

34 Go 語言中的 nil

nil 是 Go 語言中內建的一個識別符號,有人會把它當作其它語言中的NULL,這個是不準確的。本文就來介紹一下 Go 語言中的 nil 的特點。

1. nil 是特殊的零值

在 Go 語言中,任何一個變數在宣告之後會自動被賦予一個零值。數值型別的變數零值為0,字串為"",而指標、切片、map、通道、函式和介面的零值就是nil。

程式碼示例

package main

import (
    "fmt"
)

func main() {
    var m map[int]string
    var p *int
    var c chan int
    var s []int
    var
f func() var i interface{} fmt.Printf("map:%#v\n", m) fmt.Printf("指標:%#v\n", p) fmt.Printf("通道:%#v\n", c) fmt.Printf("切片:%#v\n", s) fmt.Printf("函式:%#v\n", f) fmt.Printf("介面:%#v\n", i) }

執行結果:

圖片描述

2. nil 識別符號無法比較

與其他語言不同,在 Go 語言中 nil 和 nil 之間是無法比較的

程式碼示例

package main

import
( "fmt" ) func main() { fmt.Println(nil == nil) }

執行結果:

圖片描述

而在 Java 中

class Untitled {
    public static void main(String[] args) {
        System.out.println(null==null);
    }
}

以上程式碼會輸出 true

3. 不同型別的 nil 的長度不同

不同型別的變數的記憶體分配都是不同的,即使是 nil ,分配的記憶體也是不同的。

程式碼示例:

package main

import (
    "fmt"
"unsafe" ) func main() { var m map[int]string var p *int var c chan int var s []int var f func() var i interface{} fmt.Println("map:", unsafe.Sizeof( m )) fmt.Println("指標:", unsafe.Sizeof(p)) fmt.Println("通道:", unsafe.Sizeof(c)) fmt.Println("切片:", unsafe.Sizeof(s)) fmt.Println("函式:", unsafe.Sizeof(f)) fmt.Println("介面:", unsafe.Sizeof(i)) }

執行結果:

圖片描述

4. 小結

本文主要介紹了 Go 語言中的特殊識別符號 nil 的一些特性:

  • nil 是作為標識一些特殊型別變數的零值存在的;
  • nil 和 nil 是無法比較的,nil 可以零值為 nil 的變數比較
  • nil 的長度隨著型別變化而變化