> For the complete documentation index, see [llms.txt](https://denglj.gitbook.io/essential-go/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://denglj.gitbook.io/essential-go/02-basic-types/ling-zhi.md).

# 零值

在Go语言中，如果您声明变量时没有显式地为其赋值，Go则帮您填充一个初始值。

Go帮您自动填充初始化值就被称为零值。

这跟C/C++不同，C/C++中未明确赋初值的变量有未定义值(undefined)。

各类型的零值是什么？其并不出人意料：

| 类型                   | 零值               |
| -------------------- | ---------------- |
| 布尔型 bool             | false            |
| 整数 int, uint, ...    | 0                |
| 浮点数 float32, float64 | 0.0              |
| 字符串 string           | ""               |
| 指针 pointer           | nil              |
| 切片 slice             | nil              |
| 映射 map               | nil              |
| 接口 interface         | nil              |
| 数据通道 channel         | nil              |
| 数组 array             | 所有元素都被设为对应零值     |
| 结构体 struct           | 所有成员(字段)都被设为对应零值 |
| 函数 function          | nil              |

换种方式说：

{% tabs %}
{% tab title="Go" %}

```go
package main

import (
	"fmt"
)

func main() {
	fmt.Println("zero values for basic types:")

	var zeroBool bool
	fmt.Printf("bool:       %v\n", zeroBool)

	var zeroInt int
	fmt.Printf("int:        %v\n", zeroInt)

	var zeroF32 float32
	fmt.Printf("float32:    %v\n", zeroF32)

	var zeroF64 float64
	fmt.Printf("float64:    %v\n", zeroF64)

	var zeroStr string
	fmt.Printf("string:     %#v\n", zeroStr)

	var zeroPtr *int
	fmt.Printf("pointer:    %v\n", zeroPtr)

	var zeroSlice []uint32
	fmt.Printf("slice:      %v\n", zeroSlice)

	var zeroMap map[string]int
	fmt.Printf("map:        %#v\n", zeroMap)

	var zeroInterface interface{}
	fmt.Printf("interface:  %v\n", zeroInterface)

	var zeroChan chan bool
	fmt.Printf("channel:    %v\n", zeroChan)

	var zeroArray [5]int
	fmt.Printf("array:      %v\n", zeroArray)

	type struc struct {
		a int
		b string
	}
	var zeroStruct struc
	fmt.Printf("struct:     %#v\n", zeroStruct)

	var zeroFunc func(bool)
	fmt.Printf("function:   %v\n", zeroFunc)
}
```

{% endtab %}

{% tab title="Output" %}

```
zero values for basic types:
bool:       false
int:        0
float32:    0
float64:    0
string:     ""
pointer:    <nil>
slice:      []
map:        map[string]int(nil)
interface:  <nil>
channel:    <nil>
array:      [0 0 0 0 0]
struct:     main.struc{a:0, b:""}
function:   <nil>
```

{% endtab %}
{% endtabs %}

:point\_right: [点击此处](https://play.golang.org/p/avibDVJ6e5D) :point\_left: 亲自在编程操场执行上述代码。
