Go 语言入门系列(二):变量、类型与控制流——Go 的语法主干

本篇目标:掌握日常编码离不开的基础构件。Go 语法看起来"反直觉"的地方,背后都有一致性考量,讲清楚比死记更重要。

一、变量声明

三种写法:

var name string = "Gopher"   // 完整
var age = 30                 // 类型推断
count := 42                  // 短声明,仅函数内可用

零值机制:只声明不赋值,变量自动获得零值——数值 0、字符串 ""、布尔 false、指针/slice/map/接口 nil。这避免了"未初始化"的混乱,也让结构体的零值通常直接可用。

声明必须使用:声明了局部变量却不用,编译报错。强制代码干净。

二、基本类型

  • 整数:int、int8/16/32/64、uint 系列

  • 浮点:float32、float64

  • 字符串:string(不可变)

  • 布尔:bool

  • 字符:byte(uint8 别名)、rune(int32 别名,表示 Unicode 码点)

没有隐式转换,类型不同必须显式转:

var i int = 10
var f float64 = float64(i)

三、常量与 iota

const Pi = 3.14

const (
    A = iota   // 0
    B          // 1
    C          // 2
)

iota 在每个 const 块内从 0 递增,适合定义枚举。

四、控制流

if——条件前可带初始化语句,变量只在块内可见,错误处理常用:

if err := doSomething(); err != nil {
    fmt.Println(err)
}

for——Go 只有 for,覆盖所有循环:

for i := 0; i < 5; i++ { }      // 经典三段式
for n < 3 { n++ }                // 类似 while
for i, v := range slice { }      // 遍历
for { }                          // 无限循环

switch——默认不穿透,无需 break;可无表达式:

switch {
case n < 0:
    fmt.Println("负")
case n == 0:
    fmt.Println("零")
default:
    fmt.Println("正")
}

五、函数

多返回值是 Go 的特征,直接塑造了错误处理风格:

func divide(a, b int) (int, error) {
    if b == 0 {
        return 0, fmt.Errorf("除数不能为零")
    }
    return a / b, nil
}

result, err := divide(10, 2)
if err != nil {
    return
}
  • 同类型参数合并声明:a, b int

  • 可变参数:func sum(nums ...int)

  • 命名返回值:func f() (n int),初学建议少用,未命名更清晰

六、值传递与指针

Go 全是值传递。传参时复制一份,函数内改不到外面。需要修改原值或避免大结构体复制时用指针:

func inc(p *int) { *p++ }

x := 1
inc(&x)   // x 变成 2

& 取地址,* 解引用。指针本身也是值传递,传的是地址的副本。

七、小结

  • 声明三种写法,零值机制让变量总有合法初始值,声明必须使用

  • 类型写在变量名后,无隐式转换

  • for 统一循环,switch 默认不穿透

  • 多返回值 + error 是 Go 错误处理的基础

  • 全是值传递,需要改原值用指针

练习:写一个 minMax(nums []int) (int, int, error),切片为空时返回 error,否则返回最小最大值,在 main 里判断错误并打印。

下一篇讲复合类型:切片、map、结构体与方法——用 Go 的方式组织数据。

posted @ 2026-10-31 15:44  sunlon  阅读(5)  评论(0)    收藏  举报