Go 语言中的 nil
nil 是 Go 语言中内置的一个标识符,有人会把它当作其它语言中的NULL,这个是不准确的。本文就来介绍一下 Go 语言中的 nil 的特点。
1. nil 是特殊的零值
在 Go 语言中,任何一个变量在声明之后会自动被赋予一个零值。数值类型的变量零值为0,字符串为"",而指针、切片、map、通道、函数和接口的零值就是nil。
代码示例
代码块
- 1
package main
- 2
- 3
import (
- 4
"fmt"
- 5
)
- 6
- 7
func main() {
- 8
var m map[int]string
- 9
var p *int
- 10
var c chan int
- 11
var s []int
- 12
var f func()
- 13
var i interface{}
- 14
fmt.Printf("map:%#vn", m)
- 15
fmt.Printf("指针:%#vn", p)
- 16
fmt.Printf("通道:%#vn", c)
- 17
fmt.Printf("切片:%#vn", s)
- 18
fmt.Printf("函数:%#vn", f)
- 19
fmt.Printf("接口:%#vn", i)
- 20
}
执行结果:
2. nil 标识符无法比较
与其他语言不同,在 Go 语言中 nil 和 nil 之间是无法比较的。
代码示例
代码块
- 1
package main
- 2
- 3
import (
- 4
"fmt"
- 5
)
- 6
- 7
func main() {
- 8
fmt.Println(nil == nil)
- 9
}
执行结果:
而在 Java 中:
代码块
- 1
class Untitled {
- 2
public static void main(String[] args) {
- 3
System.out.println(null==null);
- 4
}
- 5
}
以上代码会输出 true。
3. 不同类型的 nil 的长度不同
不同类型的变量的内存分配都是不同的,即使是 nil ,分配的内存也是不同的。
代码示例:
代码块
- 1
package main
- 2
- 3
import (
- 4
"fmt"
- 5
"unsafe"
- 6
)
- 7
- 8
func main() {
- 9
var m map[int]string
- 10
var p *int
- 11
var c chan int
- 12
var s []int
- 13
var f func()
- 14
var i interface{}
- 15
fmt.Println("map:", unsafe.Sizeof( m ))
- 16
fmt.Println("指针:", unsafe.Sizeof(p))
- 17
fmt.Println("通道:", unsafe.Sizeof(c))
- 18
fmt.Println("切片:", unsafe.Sizeof(s))
- 19
fmt.Println("函数:", unsafe.Sizeof(f))
- 20
fmt.Println("接口:", unsafe.Sizeof(i))
- 21
}
执行结果:
4. 小结
本文主要介绍了 Go 语言中的特殊标识符 nil 的一些特性:
- nil 是作为标识一些特殊类型变量的零值存在的;
- nil 和 nil 是无法比较的,nil 可以零值为 nil 的变量比较;
- nil 的长度随着类型变化而变化。
文章来源于网络,侵删!