跳转到主要内容
模块 1 · 第 2 课(共 5)课程中的2/50~10 min
模块课程(2/5)

零值和类型转换

在 Go 中,每个没有显式声明值的变量都会收到一个 零值:其类型的“中性值”。这是一个巨大的差异 来自 JavaScript,其中 let x; 生成 undefined,或 C,在此处结束 加上垃圾内存。没有 undefined,没有 UB:只有零。

零值表

| 类别 | 类型 | 零值 | | -------------- | ------------------------------------------------- | ------------------------------- | ----- | | 数字 | int、int64、float32、float64、uint、... | 0 | 0 | | 布尔 | bool | false | | 字符串 | string | ""(空字符串) | | 指针 | *T | *T nil | | 切片/地图/通道 | []T、map[K]V、chan T | nil | nil | | 功能/接口 | func(...)、interface{...} | nil | nil | | 结构 | T struct{...} | T struct{...}所有字段均为零值 |

Go
var i int        // 0
var f float64    // 0
var s string     // ""
var b bool       // false
var p *int       // nil
var nums []int   // nil  (NB: una slice nil ha len 0 e si può iterare!)

转换始终是显式的

与 C、Python 或 JS 不同,Go 不会自动提升之一 数字类型转换为另一种类型:您必须编写 type(value)。

Go
i := 42
var f float64 = float64(i)
var u uint = uint(i)

即使对于像 int 和 int64 这样的“兼容”类型也是如此: 始终需要显式转换。

Go
var a int = 10
var b int64 = int64(a)  // obbligatorio

数字之间的转换:注意截断

从 float64 到 int 朝零截断,它不会 回合:

Go
f := 3.9
i := int(f)   // 3, non 4
n := int(-3.9) // -3, non -4

字符串↔数字转换

string(65) 不给出 "65":它给出 "A" (带有代码的符文 第 65 点)。对于字符串 → 数字,反之亦然,您需要 strconv 封装:

Go
import "strconv"

s := strconv.Itoa(42)        // "42"
n, err := strconv.Atoi("42") // 42, nil

我们将在 Stdlib 模块中深入介绍它。

轮到你了

锻炼#go.m1.l2.e1
尝试:0加载中...

声明一个 int 类型的变量 counter 而不初始化它并打印它。预期:0。

正在加载编辑器...
显示提示

如果没有初始值设定项,变量将采用该类型的零值。

3 次尝试后可用的解决方案

锻炼#go.m1.l2.e2
尝试:0加载中...

给定整数 n=10,将 n 转换为 float64 并除以 4。打印结果(预期为 2.5)。

正在加载编辑器...
显示提示

如果没有显式转换,“n / 4”是一个整数除法,结果为 2。

3 次尝试后可用的解决方案

Quiz#go.m1.l2.e3
准备好

这段代码打印什么?

Go
f := 3.7
fmt.Println(int(f))
答案选项

回顾

  • 每个类型都有一致的零值:没有 undefined,没有 UB。
  • Slice/map/chan/func/interface/pointer 的值为零 nil。
  • 数字转换始终使用 type(value) 进行显式转换。
  • int(float) 向零截断;舍入使用 math.Round。
  • 对于字符串↔数字,使用 strconv 包(不是直接转换)。