Go 語言中的 nil
nil 是 Go 語言中內置的一個標識符,有人會把它當作其它語言中的NULL,這個是不準確的。本文就來介紹一下 Go 語言中的 nil 的特點。
1. nil 是特殊的零值
在 Go 語言中,任何一個變量在聲明之后會自動被賦予一個零值。數(shù)值類型的變量零值為0,字符串為"",而指針、切片、map、通道、函數(shù)和接口的零值就是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("函數(shù):%#v\n", f)
fmt.Printf("接口:%#v\n", i)
}
執(zhí)行結果:
2. nil 標識符無法比較
與其他語言不同,在 Go 語言中 nil 和 nil 之間是無法比較的。
代碼示例
package main
import (
"fmt"
)
func main() {
fmt.Println(nil == nil)
}
執(zhí)行結果:
而在 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("函數(shù):", unsafe.Sizeof(f))
fmt.Println("接口:", unsafe.Sizeof(i))
}
執(zhí)行結果:
4. 小結
本文主要介紹了 Go 語言中的特殊標識符 nil 的一些特性:
- nil 是作為標識一些特殊類型變量的零值存在的;
- nil 和 nil 是無法比較的,nil 可以零值為 nil 的變量比較;
- nil 的長度隨著類型變化而變化。