tools 工具 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 整理依赖