模块课程(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{...}所有字段均为零值 |
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)。
i := 42
var f float64 = float64(i)
var u uint = uint(i)即使对于像 int 和 int64 这样的“兼容”类型也是如此:
始终需要显式转换。
var a int = 10
var b int64 = int64(a) // obbligatorio数字之间的转换:注意截断
从 float64 到 int 朝零截断,它不会
回合:
f := 3.9
i := int(f) // 3, non 4
n := int(-3.9) // -3, non -4字符串↔数字转换
string(65) 不给出 "65":它给出 "A" (带有代码的符文
第 65 点)。对于字符串 → 数字,反之亦然,您需要 strconv
封装:
import "strconv"
s := strconv.Itoa(42) // "42"
n, err := strconv.Atoi("42") // 42, nil我们将在 Stdlib 模块中深入介绍它。
轮到你了
声明一个 int 类型的变量 counter 而不初始化它并打印它。预期:0。
显示提示
如果没有初始值设定项,变量将采用该类型的零值。
3 次尝试后可用的解决方案
给定整数 n=10,将 n 转换为 float64 并除以 4。打印结果(预期为 2.5)。
显示提示
如果没有显式转换,“n / 4”是一个整数除法,结果为 2。
3 次尝试后可用的解决方案
这段代码打印什么?
f := 3.7
fmt.Println(int(f))回顾
- 每个类型都有一致的零值:没有
undefined,没有 UB。 - Slice/map/chan/func/interface/pointer 的值为零
nil。 - 数字转换始终使用
type(value)进行显式转换。 int(float)向零截断;舍入使用math.Round。- 对于字符串↔数字,使用
strconv包(不是直接转换)。