Basic Syntax(基础语法)
本篇是路线总览,不替代后续专题。读完后应能读懂一个包含包、声明、分支、循环、函数和错误返回的简单 Go 程序;遇到细节时,沿着文中的专题链接继续学习。
最小 Go 程序
可执行程序必须属于 main 包,并提供无参数、无返回值的 main 函数:
package main
import "fmt"
func main() {
fmt.Println("Hello, Go!")
}
保存为 main.go 后,在文件所在目录运行:
go run main.go
源文件通常不手写分号。词法分析器会按行末规则插入分号,因此函数或控制结构的左花括号必须与声明位于同一行。格式交给 gofmt:
gofmt -w main.go
程序结构、包名和导入路径的完整解释见 Package(包) 与 Import / Export(导入与导出)。
声明、类型与零值
Go 是静态类型语言。变量必须有确定类型,声明但未初始化时取得该类型的零值:
package main
import "fmt"
func main() {
var count int
var title string
active := true
fmt.Printf("%d %q %t\n", count, title, active)
}
函数内部可以使用 := 短变量声明;包级声明使用 var、const 或 type。:= 左侧必须至少包含一个当前作用域中的新变量,普通赋值则使用 =。详细规则见 Variables(变量)、Constants(常量) 和 Data Types(数据类型)。
常见基础类型包括 bool、有符号和无符号整数、浮点数、复数和 string。Go 不会在不同命名数值类型之间隐式转换,类型转换必须显式写成 T(value);转换本身不提供溢出检查。
运算符与控制流
整数除法向零截断,条件表达式必须是 bool,Go 没有 while 和三元条件运算符:
package main
import "fmt"
func classify(score int) string {
switch {
case score >= 90:
return "excellent"
case score >= 60:
return "passed"
default:
return "failed"
}
}
func main() {
for score := 55; score <= 95; score += 20 {
fmt.Println(score, classify(score))
}
}
Go 只有 for 循环关键字,可以写成三段式、条件循环或无限循环。range 的返回值取决于被遍历的类型,映射顺序没有语言保证。switch 默认只执行第一个匹配分支,不会自动贯穿。完整边界见 Operator(运算符)、Conditional Control(条件控制) 和 Loop Control(循环控制)。
函数与错误返回
参数类型写在参数名之后,返回类型写在参数列表之后。函数可以返回多个值,错误通常作为最后一个返回值并由调用方显式检查:
package main
import (
"errors"
"fmt"
)
func divide(dividend, divisor int) (int, error) {
if divisor == 0 {
return 0, errors.New("divisor must not be zero")
}
return dividend / divisor, nil
}
func main() {
result, err := divide(10, 2)
if err != nil {
fmt.Println("divide:", err)
return
}
fmt.Println(result)
}
函数类型、闭包、递归、defer 和完整错误处理位于 Function(函数) 与 Error(错误处理)。
前端迁移时最容易带错的规则
| 对比项 | Go | TypeScript/JavaScript |
|---|---|---|
| 条件 | 必须是 bool | 支持 truthy/falsy 转换 |
| 循环 | 统一使用 for | 还有 while、do...while 等 |
| 错误 | 通常显式返回并逐层处理 | 常见 throw 或 Promise rejection |
| 导出 | 包级名称、字段和方法首字母大小写决定 | 使用 export |
| 变量 | 始终有静态类型和零值 | 运行时值可为 undefined |
这些对比只用于建立迁移线索,不能把 Go 的接口、切片、nil 或错误值直接等同于前端概念。
常见错误
- 在包级使用
:=,或在同一作用域中没有新变量时继续使用:=。 - 把数字、字符串或
nil直接写成条件。 - 把数组、切片和映射都理解成“对象引用”,忽略复制和共享规则。
- 忽略多返回值中的
error,或在每一层重复记录同一个错误。 - 依赖映射遍历顺序,或在循环中创建没有退出路径的无限循环。
练习与验证
使用切片保存多个成绩,编写返回 (string, error) 的分类函数,拒绝超出 0..100 的输入,并为边界值、非法值和正常值编写表格驱动测试。执行:
gofmt -w .
go test ./...
go run .
小结
- Go 程序由包组织,
main包中的main函数是可执行入口。 - 变量有静态类型和零值,短变量声明只在函数内使用。
- 条件必须是
bool,for是唯一循环关键字,switch默认不贯穿。 - 函数可以返回多个值,错误通常显式传播和检查。
- 细节应继续阅读本目录专题,再进入函数、接口、错误、并发和测试等进阶文档。