Go 语言快速入门
Go(Golang)是 Google 开发的编译型语言,语法简洁、编译快、天生支持并发,特别适合写命令行工具、Web 服务和数据处理程序,很多生信工具(如 Singularity、MinIO)都用 Go 写的。
核心知识点
| 知识点 | 说明 |
|---|
| 语言类型 | 编译型,静态类型 |
| 开发者 | Google(Rob Pike, Ken Thompson, Robert Griesemer) |
| 核心优势 | 语法极简、编译极快、goroutine 并发模型 |
| 包管理 | Go Modules(go mod) |
| 适用场景 | CLI 工具、微服务、网络编程、DevOps 工具 |
安装配置
# 下载安装(推荐官方安装)
wget https://go.dev/dl/go1.23.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.23.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin # 添加到 PATH
go version # 验证安装
基本使用
Hello World
// main.go
package main // 包名,main 包是入口
import "fmt" // 导入 fmt 包(格式化输出)
func main() {
// 变量声明
name := "Go" // 短变量声明(自动推断类型)
var age int = 25 // 显式声明类型
bmi := 28.5 // float64
fmt.Printf("Hello %s! Age: %d, BMI: %.1f\n", name, age, bmi)
// 数组和切片
samples := []string{"T2D_001", "T2D_002", "HC_001"} // 切片
for i, s := range samples { // range 遍历
fmt.Printf("%d: %s\n", i, s)
}
// Map
abundance := map[string]float64{ // map[键类型]值类型
"Bacteroides": 0.35,
"Firmicutes": 0.40,
}
for k, v := range abundance {
fmt.Printf("%s: %.2f\n", k, v)
}
}
go run main.go # 直接运行
go build -o myapp main.go # 编译为可执行文件
并发(Goroutine)
package main
import (
"fmt"
"sync"
)
func process(id int, wg *sync.WaitGroup) {
defer wg.Done() // 函数结束时通知完成
fmt.Printf("处理样本 %d\n", id)
}
func main() {
var wg sync.WaitGroup // 等待组
for i := 1; i <= 5; i++ {
wg.Add(1) // 添加一个任务
go process(i, &wg) // go 关键字启动 goroutine(并发)
}
wg.Wait() // 等待所有 goroutine 完成
fmt.Println("全部完成")
}
错误处理
package main
import (
"fmt"
"os"
)
func readFile(path string) (string, error) {
data, err := os.ReadFile(path) // Go 的错误处理:返回值 + error
if err != nil { // 检查错误
return "", fmt.Errorf("读取失败: %w", err) // 包装错误
}
return string(data), nil // nil 表示无错误
}
func main() {
content, err := readFile("data.txt")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Println(content)
}
高级用法
结构体和接口
type Sample struct { // 结构体定义
ID string
Diagnosis string
BMI float64
}
func (s Sample) IsOverweight() bool { // 方法
return s.BMI > 25.0
}
// 接口
type Analyzer interface {
Analyze() string
}
func (s Sample) Analyze() string { // 实现接口(隐式)
if s.IsOverweight() {
return s.ID + " 超重"
}
return s.ID + " 正常"
}
常见报错与解决
| 报错信息 | 原因 | 解决方法 |
|---|
undefined | 变量未声明或包未导入 | 检查导入和声明 |
unused variable | 声明了变量但没用 | Go 强制要求使用已声明变量,用 _ 忽略 |
cannot use X as type Y | 类型不匹配 | 显式类型转换 |
速查表
// ===== Go 速查表 =====
// 变量
x := 5 // 短声明
var y int = 10 // 显式
// 函数
func add(a, b int) int { return a + b }
func div(a, b int) (int, error) { ... } // 多返回值
// 控制流
if err != nil { }
for i := 0; i < 10; i++ { }
for k, v := range slice { }
switch x { case 1: ... }
// 并发
go func() { }() // goroutine
ch := make(chan int) // channel
// 命令
// go run main.go 运行
// go build 编译
// go test ./... 测试
// go mod init module 初始化模块
// go mod tidy 整理依赖