跳转至

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