变量与输出
约 1025 字大约 3 分钟
2026-01-18
1. 变量声明
Go 是强类型语言,声明变量使用关键字 var,紧跟名称与类型。如果在一行内完成声明与赋值,可以省略类型让编译器推断。
1.1 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)
}1.2 短变量声明
短变量声明是变量声明与赋值的简写模式,通过 := 的方式快速声明,这种方式只能出现在函数体内。且可以使用 , 分隔多个变量来集中声明
短变量声明
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 保证有新变量出现
1.3 零值
所谓零值指的是变量在未显式赋值时获得的其类型对应的默认值
不同类型的零值
- 数值型(含整型、浮点型、复数):
0/0.0 - 布尔型:
false - 字符串:
"" - 指针、切片、map、chan、函数:
nil
2. 基础类型
整形
整形包含与平台位宽一致的 int/uint 以及定长的 int8/16/32/64 和 uint8/16/32/64。在业务逻辑中推荐默认用 int,在网络协议、文件格式等需要明确字节长度时再选定长类型
byte 是 uint8 的别名常用于原始字节,rune 是 int32 的别名适合存储 Unicode 码点
浮点类型
浮点数有 float32(约 6~7 位小数精度)和 float64(约 15~16 位小数,字面量默认推断为此类型)
字符串类型
字符串是不可变的 UTF-8 字节序列,用 string 表示
布尔类型
布尔值只有 true 与 false,Go 不接受用数字代替布尔表达式
复杂类型
复杂类型使用较少,但内置 complex64(两部分为 float32)与 complex128(两部分为 float64)可满足数值计算场景
nil
仅适用于指针、切片、map、chan、函数、接口等引用类型,表示“未指向任何值”。基本类型(整型、浮点、布尔、字符串)不会是 nil,有各自的零值。
3. 输出与格式化
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:输出变量的动态类型