ESC
输入关键词搜索文章
目录

Go 入门 02

语法 · 类型 · 控制流
用最少语法写出可读程序
var变量
:=短声明
for唯一循环
Chapter 02
Go 的语法目标:少而清楚

Go 的语法刻意保持紧凑。官方规范把 Go 描述为强类型、垃圾回收、显式支持并发的通用语言;这种设计落到日常代码里,就是类型要明确、控制流要直接、格式由工具统一。

定义:静态类型

静态类型语言会在编译阶段检查变量和表达式的类型。Go 允许很多类型由编译器推断,但推断之后类型仍然固定。

初学 Go 时,不要追求炫技写法。优先写出能被 gofmt 格式化、能被同伴快速读懂的普通代码。

Variables
变量、常量与零值

Go 声明变量有两种常见方式:var 声明和 := 短变量声明。var 可以用于包级或函数内;:= 只能在函数内部使用。

package main

import "fmt"

func main() {
    var name string = "Gopher"
    age := 3
    const language = "Go"

    fmt.Println(name, age, language)
}

Go 变量如果声明但没有显式赋值,会得到该类型的零值。数字是 0,布尔是 false,字符串是空字符串,指针、slice、map、函数、接口、channel 的零值是 nil

易错点:Go 不允许声明局部变量后完全不用。这个限制会迫使你及时删掉死代码,让程序保持干净。
Types
基础类型与类型转换

Go 常用基础类型包括整数、浮点数、布尔、字符串和字节/字符相关类型。字符串是 UTF-8 字节序列;当你需要逐个 Unicode 码点处理文本时,常会用到 rune

类型例子说明
int42平台相关宽度的有符号整数,日常计数常用
float643.14双精度浮点数
booltrue只能是 truefalse
string"hello"不可变字节序列,通常保存 UTF-8 文本
byte'A'uint8 的别名,常用于原始字节
rune'你'int32 的别名,常表示 Unicode 码点

表 1:入门阶段最常遇到的 Go 基础类型。

Go 不会自动在不同数字类型之间隐式转换。需要转换时显式写出来:

var count int = 3
var ratio float64 = float64(count) / 2.0
fmt.Println(ratio)
Pointers
指针只保存地址,不做指针算术
指针是保存变量地址的值。Go 有指针,但没有 C/C++ 那种指针算术;这让你可以表达“我要修改原变量”,同时避免很多底层地址运算错误。
func addOne(number *int) {
    *number = *number + 1
}

func main() {
    value := 10
    addOne(&value)
    fmt.Println(value)
}
&value 取地址,*number 访问指针指向的值。初学阶段只要记住:当函数需要修改外部变量,或者复制大结构体代价较高时,指针会出现。
Control Flow
if、for、switch

Go 的条件语句不需要圆括号,但代码块的大括号是必须的。

if score >= 60 {
    fmt.Println("pass")
} else {
    fmt.Println("retry")
}

Go 只有一个循环关键字:for。它既可以写成经典三段式,也可以写成类似 while 的形式,还可以配合 range 遍历集合。

for index := 0; index < 3; index++ {
    fmt.Println(index)
}

count := 0
for count < 3 {
    count++
}

names := []string{"Ada", "Ken", "Rob"}
for index, name := range names {
    fmt.Println(index, name)
}
switch 适合表达多分支选择。Go 的 switch 默认不会自动贯穿到下一个 case,这比很多 C 系语言更不容易写错。
switch day := "Friday"; day {
case "Saturday", "Sunday":
    fmt.Println("weekend")
default:
    fmt.Println("weekday")
}

复习速查

  • :=:函数内部短变量声明。
  • 零值:未显式赋值时的默认值。
  • 显式转换:Go 不自动转换不同数字类型。
  • 指针:保存地址,用 & 取地址,用 * 解引用。
  • for:Go 唯一循环关键字。

参考来源