变量与输出
约 943 字大约 3 分钟
2026-01-18
变量声明
Go 是强类型语言,声明变量使用关键字 var,紧跟名称与类型。如果在一行内完成声明与赋值,可以省略类型让编译器推断
var 声明
var 声明主要有两种方式,一是先声明变量名后赋值,这种方式是需要显示指定类型;二是变量声明与初始化同时进行,这种方式无需指定类型,编译器可以根据初始值自动推断类型
var 声明
package main
import "fmt"
// 包级变量
var pkgLevel int
func main() {
var count int // 显式类型,分开声明
var ratio = 1.5 // 根据右值推断为 float64
count = 3
fmt.Println(count, ratio, pkgLevel)
}短变量声明
短变量声明是变量声明与赋值的简写模式,通过 := 的方式快速声明,这种方式只能出现在函数体内。且可以使用 , 分隔多个变量来集中声明
短变量声明
package main
import "fmt"
func main() {
msg := "auto type" // 新变量
msg, ok := "reuse", true // msg 复用,ok 新增,合法
a, b := 10, true // 一次声明多个不同类型
_, _ = a, b // 占位避免未使用报错
fmt.Println(msg, ok, a, b)
}重要
同一作用域再次使用 := 时必须有至少一个新变量,否则报重复声明,例如 x := 1 x := 2 将会编译报错,要么将后面的改成 x = 2,要么写成 x, y := 1, 2 保证有新变量出现
零值
所谓零值指的是变量在未显式赋值时获得的其类型对应的默认值
| 类型 | 零值 |
|---|---|
| 整型 | 0 |
| 浮点型 | 0.0 |
| 布尔型 | false |
| 字符串 | "" |
| 指针、切片、map、chan、函数 | nil |
基础类型
| 类型 | 描述 |
|---|---|
| 整形 | 包含与平台位宽一致的 int/uint 以及定长的 int8/16/32/64 和 uint8/16/32/64 |
| 浮点型 | float32(约 6~7 位小数精度)和 float64(约 15~16 位小数,字面量默认推断为此类型) |
| 字符串 | 字符串是不可变的 UTF-8 字节序列,用 string 表示 |
| 布尔型 | 布尔值只有 true 与 false,Go 不接受用数字代替布尔表达式 |
| 复杂类型 | complex64(两部分为 float32)与 complex128(两部分为 float64)可满足数值计算场景 |
nil | 用于指针、切片、map、chan、函数、接口等引用类型,表示 "未指向任何值" |
提示
- 基本类型不会是
nil,它们有各自的零值 byte是uint8的别名rune是int32的别名,适合存储 Unicode 码点
输出与格式化
fmt 包提供三类常用输出:
fmt.Print:按原样输出,不自动换fmt.Println:输出后追加换行,参数间自动加空格,等价于默认格式%vfmt.Printf:按格式字符串输出,是否换行取决于格式字符串中是否含\n
Println 与 Printf 的差异
package main
import "fmt"
func main() {
f := 5.0
fmt.Println("Println:", f) // 默认格式,浮点紧凑展示
fmt.Printf("%%f: %f\n", f) // 默认 6 位小数
fmt.Printf("%%.2f: %.2f\n", f) // 控制小数位
fmt.Printf("%%T: %T\n", f) // 输出变量类型
}提示
Println 与 Printf 在打印浮点数时会有些许差异。fmt.Println 的浮点默认格式类似 %g,会使用最简洁的表示,所以 0.0 会显示为 0。fmt.Printf("%f") 则固定输出 6 位小数,因此显示为 0.000000,二者值相同,仅展示格式不同
常见格式化占位符
%d:十进制整型%t:布尔值%f/%.nf:浮点数,默认 6 位小数,.n指定精度%g:浮点紧凑格式(用于避免多余的零)%c:把整数按对应的 Unicode 码点输出为字符%T:输出变量的动态类型
