零值与默认值
本课属于 Coddy GO 学习旅程的“面向对象编程”单元。第 17 课,共 107 课。
在 Go 中,每个变量都有一个零值:当你声明变量时,如果没有显式初始化,系统就会赋给它默认值。理解零值对于使用结构体至关重要,因为未初始化的字段会自动获得这些默认值。
每种类型都有自己的零值:
| 类型 | 零值 |
|---|---|
| int, float64 | 0 |
| string | ""(空字符串) |
| bool | false |
| pointer, slice, map | nil |
创建 struct 时,任何你没有显式设置的字段都会得到其零值。
type User struct {
Name string
Age int
Active bool
}
func main() {
var u User
fmt.Println(u.Name) // ""(空字符串)
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
}这也适用于部分初始化。只有你指定的字段会获得自定义值。
u := User{Name: "Alice"}
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
零值让结构体无需显式初始化即可立即使用。不过,使用切片和映射这类引用类型时要小心。它们的零值是 nil,如果你未初始化就尝试使用它们,可能会导致运行时恐慌。
挑战
简单让我们构建一个玩家档案系统,了解 Go 中零值的工作方式。你将创建一个游戏档案,其中一些字段会显式设置,其他字段则使用默认的零值。
你将把代码放在两个文件中:
player.go:定义一个包含以下字段的Player结构体:Username(字符串)、Level(整数)、Score(整数)、IsPremium(布尔值)和GuildName(字符串)。另外,创建一个DisplayProfile方法,返回一个显示玩家所有信息的格式化字符串。main.go:从输入中读取用户名,并使用部分初始化的方式创建 Player:只设置Username字段。然后显示完整档案,看看 Go 如何用零值填充未设置的字段。
输入如下:
- 第 1 行:玩家的用户名
你的 DisplayProfile 方法应返回以下格式的字符串:
Username: [Username]
Level: [Level]
Score: [Score]
Premium: [IsPremium]
Guild: [GuildName]例如,如果用户名是 ShadowKnight,输出中应显示该用户名,以及所有未初始化字段的零值:
Username: ShadowKnight
Level: 0
Score: 0
Premium: false
Guild: 注意,Guild 字段的冒号后面什么都没有:这就是空字符串的零值。这个挑战能帮助你准确了解,在你没有提供显式值时,Go 会为每种类型赋什么值。
亲手试试
package main
import (
"fmt"
)
func main() {
// 从输入中读取用户名
var username string
fmt.Scanln(&username)
// TODO:使用部分初始化创建 Player
// 只设置 Username 字段,让其他字段使用零值
// TODO:使用 DisplayProfile 方法显示玩家的资料
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Go 在线编译器