Menu
CoddyTech

零值与默认值

本课属于 Coddy GO 学习旅程的“面向对象编程”单元。第 17 课,共 107 课。

在 Go 中,每个变量都有一个零值:当你声明变量时,如果没有显式初始化,系统就会赋给它默认值。理解零值对于使用结构体至关重要,因为未初始化的字段会自动获得这些默认值。

每种类型都有自己的零值:

类型零值
int, float640
string""(空字符串)
boolfalse
pointer, slice, mapnil

创建 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,如果你未初始化就尝试使用它们,可能会导致运行时恐慌。

challenge icon

挑战

简单

让我们构建一个玩家档案系统,了解 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 方法显示玩家的资料
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Go 在线编译器