🚀 第01课:安装与Hello World

Go基础 第1阶段 · 第1/7课

📋 本课目标

🧠 为什么选择Go?

Go语言(又称Golang)由Google的Robert Griesemer、Rob Pike和Ken Thompson于2007年设计,2009年开源。它的诞生源于对C++编译慢、Java臃肿、Python性能不足的反思。Go的设计哲学可以概括为:少即是多

Go的核心优势

Go的典型应用场景

领域代表项目为什么选Go
云原生基础设施Docker, Kubernetes, Containerd高并发、低资源、单二进制
微服务Uber, Twitch, Bilibiligoroutine处理海量连接
网络代理Envoy(X), Traefik, Caddy高性能网络I/O
数据库CockroachDB, TiDB, InfluxDB内存安全+高性能
命令行工具hugo, terraform, gh快速编译、单文件分发

📦 安装Go环境

方式一:包管理器(推荐新手)

# Ubuntu/Debian
sudo apt update && sudo apt install golang-go

# macOS
brew install go

# Windows — 下载安装包:https://go.dev/dl/

方式二:官方二进制(推荐生产)

# 下载最新稳定版
wget https://go.dev/dl/go1.22.2.linux-amd64.tar.gz

# 清理旧版本并安装
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.22.2.linux-amd64.tar.gz

# 配置PATH(写入~/.bashrc或~/.zshrc)
export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin
source ~/.bashrc

验证安装

$ go version
go version go1.22.2 linux/amd64

$ go env GOPATH GOROOT GOPROXY
/home/user/go
/usr/local/go
https://proxy.golang.org,direct
💡 国内加速:设置代理 go env -w GOPROXY=https://goproxy.cn,direct

🏗️ Go项目架构

Go项目遵循约定大于配置的原则,标准目录结构如下:

myproject/ ├── go.mod ← 模块定义(类似package.json) ├── go.sum ← 依赖校验(类似package-lock.json) ├── main.go ← 程序入口(main包+main函数) ├── internal/ ← 私有包(不可被外部模块导入) │ ├── handler/ │ │ └── user.go │ └── repository/ │ └── db.go ├── pkg/ ← 可复用包(可被外部导入) │ └── utils/ │ └── helper.go ├── cmd/ ← 多入口命令 │ ├── server/ │ │ └── main.go │ └── cli/ │ └── main.go ├── api/ ← API定义(protobuf/OpenAPI) ├── configs/ ← 配置文件 ├── scripts/ ← 构建/部署脚本 └── test/ ← 集成测试

✨ Hello World — 第一个Go程序

每个Go程序都从main包的main函数开始:

package main

import "fmt"

// main函数 — 程序入口,无参数无返回值
func main() {
    fmt.Println("🚀 Hello, Go!")
    fmt.Println("欢迎来到Go后端开发的世界")

    // 短变量声明 := (只能在函数内使用)
    name := "开发者"
    age := 25
    version := 1.22

    // fmt.Printf 格式化输出
    fmt.Printf("你好,%s!你今年%d岁\n", name, age)
    fmt.Printf("Go版本:%.2f\n", version)

    // 常用格式化动词
    fmt.Println("\n--- 格式化动词演示 ---")
    fmt.Printf("布尔值:    %t\n", true)
    fmt.Printf("整数:      %d\n", 42)
    fmt.Printf("浮点数:    %.2f\n", 3.14159)
    fmt.Printf("字符串:    %s\n", "Go语言")
    fmt.Printf("类型名:    %T\n", name)
    fmt.Printf("十六进制:  %x\n", 255)
    fmt.Printf("八进制:    %o\n", 8)
    fmt.Printf("指针地址:  %p\n", &name)
}

🔍 运行验证

✅ 验证通过 — 实机编译运行结果:

🚀 Hello, Go!
欢迎来到Go后端开发的世界
你好,开发者!你今年25岁
Go版本:1.22

--- 格式化动词演示 ---
布尔值:    true
整数:      42
浮点数:    3.14
字符串:    Go语言
类型名:    string
十六进制:  ff
八进制:    10
指针地址:  0xc000014070

🔧 go mod — 模块管理详解

Go Modules是Go 1.11+引入的官方依赖管理方案,1.16后成为默认。它是现代Go项目的唯一推荐方式。

# ① 初始化新模块
mkdir myapp && cd myapp
go mod init github.com/yourname/myapp
# 生成 go.mod 文件

# ② 添加依赖(自动更新go.mod + go.sum)
go get github.com/gin-gonic/gin@latest
go get github.com/gin-gonic/gin@v1.9.1    # 指定版本

# ③ 整理依赖(添加缺失的,移除未使用的)
go mod tidy

# ④ 下载依赖到本地缓存
go mod download

# ⑤ 查看依赖树
go mod graph

# ⑥ 将依赖复制到项目vendor目录
go mod vendor

go.mod文件详解

module github.com/yourname/myapp  // 模块路径(全局唯一标识)

go 1.22                            // 最低Go版本要求

require (
    github.com/gin-gonic/gin v1.9.1  // 直接依赖
)

require (
    github.com/json-iterator/go v1.1.12 // indirect 间接依赖
)

📝 Go程序结构深度解析

1. 包声明(Package)

每个Go文件第一行必须声明所属包。main包 = 可执行程序,其他包名 = 可复用库。

命名规则:小写、简短、有意义。同一目录下所有文件的包名必须相同。

2. 导入(Import)

Go强制要求:导入的包必须使用,否则编译报错。这是Go"少废话"哲学的体现。

import (
    "fmt"           // 标准库 — 格式化I/O
    "strings"       // 标准库 — 字符串操作
    "net/http"      // 标准库 — HTTP客户端/服务端

    "github.com/gin-gonic/gin"  // 第三方包
)

3. 函数(Function)

func main()是程序入口,无参数无返回值。Go函数支持多返回值。

// 多返回值
func divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, errors.New("除数不能为零")
    }
    return a / b, nil
}

⚡ Go工具链完整速查

命令功能常用示例
go run编译并立即运行go run main.go
go build编译生成二进制文件go build -o app .
go install编译并安装到GOPATH/bingo install ./cmd/server
go test运行测试go test -v -cover ./...
go fmt格式化代码gofmt -w .
go vet静态分析可疑代码go vet ./...
go doc查看包/函数文档go doc fmt.Printf
go mod init初始化新模块go mod init myapp
go mod tidy整理依赖go mod tidy
go get添加/更新依赖go get pkg@v1.2.3
go env查看环境变量go env GOPATH
go list列出包信息go list -m all

🎯 多文件项目实战

让我们创建一个包含自定义包的完整项目:

// ── greet/greet.go ── 自定义包
package greet

import "fmt"

// Hello 返回问候语(大写字母开头=导出/公开函数)
func Hello(name string) string {
    return fmt.Sprintf("你好,%s!欢迎学习Go语言", name)
}

// Goodbye 返回告别语
func Goodbye(name string) string {
    return fmt.Sprintf("再见,%s!期待下次见面", name)
}

// Version 返回版本信息
func Version() string {
    return "greet v1.0.0"
}
// ── main.go ── 主程序入口
package main

import (
    "fmt"
    "github.com/yourname/myapp/greet"
)

func main() {
    fmt.Println(greet.Version())
    fmt.Println(greet.Hello("同学"))
    fmt.Println(greet.Goodbye("同学"))
}
💡 Go的可见性规则:大写字母开头 = 导出(public),小写字母开头 = 未导出(private)。这适用于变量、函数、类型、结构体字段等所有标识符。没有public/private关键字,通过命名约定实现。

🔄 交叉编译

Go最强特性之一:一行命令编译任意平台:

# 编译Linux amd64
GOOS=linux GOARCH=amd64 go build -o app-linux .

# 编译Windows
GOOS=windows GOARCH=amd64 go build -o app.exe .

# 编译Mac ARM(M1/M2)
GOOS=darwin GOARCH=arm64 go build -o app-mac .

# 查看所有支持的平台
go tool dist list

🏋️ 练习

练习1:个性化信息卡(基础)

编写程序,声明你的名字、年龄、城市、职业,用fmt.Printf格式化输出一张信息卡。

// 期望输出格式:
// ╔══════════════════╗
// ║   个人信息卡     ║
// ╠══════════════════╣
// ║ 姓名:张三       ║
// ║ 年龄:25         ║
// ║ 城市:北京       ║
// ║ 职业:后端开发   ║
// ╚══════════════════╝

练习2:多包计算器(进阶)

创建mathutils包,实现Add/Sub/Mul/Div四个函数,在main中调用并输出结果。

练习3:交叉编译(实战)

GOOSGOARCH分别编译Linux/Windows/Mac三个平台的二进制,用file命令验证。

🏆

成就解锁:Go新手启航

你已经成功安装Go环境,运行了第一个程序,理解了项目结构和模块管理!

下一课将学习变量与类型——Go的静态类型系统是编译时安全的基石。