一、环境搭建与项目初始化
1. 安装与验证
- 下载地址:https://go.dev/dl/
- 验证安装
bash
go version
2. Go Modules 项目创建(现代标准)
bash
mkdir go-demo && cd go-demo
go mod init go-demo
3. 第一个 Go 程序
go
package main
import "fmt"
func main() {
fmt.Println("Hello, Go 服务开发!")
}
运行方式:
bash
go run main.go # 直接运行
go build # 编译为可执行文件
二、变量、常量与基础语法
1. 变量声明
- 完整声明
go
var age int = 25
- 类型推导(最常用)
go
name := "test-dev"
- 批量声明
go
var (
score float64 = 99.0
isOk bool = true
)
2. 常量
go
const Version = "v1.0.0"
3. 流程控制
(1)if 判断
go
if score >= 60 {
fmt.Println("及格")
} else {
fmt.Println("不及格")
}
(2)for 循环(Go 唯一循环)
go
// 普通循环
for i := 0; i < 5; i++ {
fmt.Println(i)
}
// 遍历切片/数组
arr := []int{1,2,3}
for idx, val := range arr {
fmt.Println(idx, val)
}
(3)switch
go
switch day := 3; day {
case 1:
fmt.Println("周一")
case 2,3:
fmt.Println("周二/周三")
default:
fmt.Println("其他")
}
三、基本数据类型(简洁格式版)
1. 整型(Integers)
- 功能:表示整数
- 类型:int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, uintptr
- 初始化:
go
var a int = 10
b := 20
- 用法示例:
go
var c int = a + b
fmt.Println(c) // 输出:30
2. 浮点型(Floats)
- 功能:表示有小数点的数字
- 类型:float32, float64
- 初始化:
go
var x float64 = 10.5
y := 20.5
- 用法示例:
go
fmt.Println(x * y) // 输出:215.25
3. 布尔型(Boolean)
- 功能:表示逻辑真或假
- 类型:bool
- 初始化:
go
var isTrue bool = true
isFalse := false
- 用法示例:
go
fmt.Println(isTrue && isFalse) // 输出:false
4. 字符串(String)
- 功能:表示一系列字符
- 类型:string
- 初始化:
go
var str string = "Hello, World!"
greeting := "Hi there!"
- 用法示例:
go
fmt.Println(str + " " + greeting) // 输出:Hello, World! Hi there!
四、复杂数据结构(核心高频 · 简洁格式版)
1. 数组(Array)
- 功能:固定长度的同类型元素序列
- 类型:[N]Type
- 初始化:
go
var arr [3]int = [3]int{1, 2, 3}
- 用法示例:
go
fmt.Println(arr[1]) // 输出:2
arr[2] = 5
2. 切片(Slice)
- 功能:可变长度的同类型元素序列
- 类型:[]Type
- 初始化:
go
slice := []int{1, 2, 3}
s := make([]int, 0)
s2 := make([]int, 5, 10)
- 用法示例:
go
slice = append(slice, 4)
sub := slice[1:3]
fmt.Println(slice) // 输出:[1 2 3 4]
3. 映射(Map)
- 功能:键值对的集合
- 类型:map[KeyType]ValueType
- 初始化:
go
m := map[string]int{"one": 1, "two": 2}
m2 := make(map[string]int)
- 用法示例:
go
m["three"] = 3
fmt.Println(m["one"]) // 输出:1
delete(m, "two")
val, exists := m["three"]
if exists {
fmt.Println(val)
}
4. 结构体(Struct)
- 功能:组合多个不同/相同类型的数据
- 类型:struct
- 初始化:
go
type Person struct {
Name string
Age int
}
p := Person{"John", 30}
p2 := Person{Name: "Tom", Age: 25}
- 用法示例:
go
fmt.Println(p.Name) // 输出:John
p.Age = 31
5. 接口(Interface)
- 功能:抽象类型,定义必须实现的方法
- 类型:interface
- 定义:
go
type Shape interface {
Area() float64
}
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return math.Pi * c.Radius * c.Radius
}
- 用法示例:
go
c := Circle{Radius: 5}
fmt.Println(c.Area())
五、函数与错误处理(服务必备)
1. 函数定义
go
func add(a int, b int) int {
return a + b
}
2. 多返回值(Go 特色)
go
func divide(a, b int) (int, error) {
if b == 0 {
return 0, fmt.Errorf("divide by zero")
}
return a / b, nil
}
3. defer 资源释放
go
file, err := os.Open("test.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
六、包管理与模块化开发
1. 导入包
go
import (
"fmt"
"log"
"os"
)
2. 自定义包结构
go-demo/
├── go.mod
├── main.go
└── utils/
└── tool.go
utils/tool.go:
go
package utils
func CheckPass(score int) bool {
return score >= 60
}
main.go 调用:
go
package main
import (
"fmt"
"go-demo/utils"
)
func main() {
fmt.Println(utils.CheckPass(80))
}
七、实战:HTTP 接口服务(测试开发/后台服务必备)
go
package main
import (
"encoding/json"
"fmt"
"net/http"
)
type Resp struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data interface{} `json:"data"`
}
func hello(w http.ResponseWriter, r *http.Request) {
res := Resp{200, "success", "hello go service"}
json.NewEncoder(w).Encode(res)
}
func main() {
http.HandleFunc("/", hello)
fmt.Println("server start at :8080")
http.ListenAndServe(":8080", nil)
}
八、Go 服务开发核心语法(维护后台任务必学)
1. context 上下文(控制协程退出)
- 作用:管理 goroutine 生命周期、取消、超时、信号传递
- 标准退出写法(服务开发必用)
go
func StartTask(ctx context.Context) error {
interval := 5 * time.Second
for {
// 执行业务逻辑
DoTask()
time.Sleep(interval)
// 监听退出信号,正常退出
select {
case <-ctx.Done():
return ctx.Err()
default:
}
}
}
2. 协程池 + 等待组 sync.WaitGroup(并发消费)
作用:控制并发数、批量处理数据、防止协程泄漏
go
func HandleTask(ctx context.Context, tasks []TaskData) {
var wg sync.WaitGroup
maxGoroutine := 10 // 最大并发协程数
for _, task := range tasks {
// 控制并发数量
for currentCount >= maxGoroutine {
time.Sleep(100 * time.Millisecond)
}
wg.Add(1)
currentCount++
go func(t TaskData) {
defer wg.Done()
defer currentCount--
// 消费逻辑
ProcessTask(ctx, t)
}(task)
}
wg.Wait() // 等待所有协程完成
}
3. 定时循环任务(后台解析/消费服务通用)
go
func StartCycleTask(ctx context.Context) {
ticker := time.NewTicker(10 * time.Second)
defer ticker.Stop()
for {
select {
case <-ticker.C:
// 定时执行:解析日志、消费数据、更新DB
DoParseLog()
case <-ctx.Done():
log.Println("任务退出")
return
}
}
}
4. 日志解析通用模板(文本/JSON日志解析)
go
// 日志结构体
type LogData struct {
Time string `json:"time"`
Type string `json:"type"`
Content string `json:"content"`
}
// 解析日志
func ParseLog(logStr string) (*LogData, error) {
var data LogData
err := json.Unmarshal([]byte(logStr), &data)
if err != nil {
return nil, err
}
return &data, nil
}
5. 数据库操作模板(查询/更新/插入)
go
// 查询待处理数据
func QueryUnProcessData(ctx context.Context, limit int) ([]DataItem, error) {
list := make([]DataItem, 0, limit)
now := time.Now().Add(-30 * time.Minute).Format("2006-01-02 15:04:05")
// SQL示例:查询30分钟内未处理数据
err := db.WithContext(ctx).
Table("data_table").
Where("status = ? AND create_time >= ?", 0, now).
Limit(limit).
Find(&list).Error
return list, err
}
// 更新数据状态
func UpdateDataStatus(ctx context.Context, id int, status int) error {
return db.WithContext(ctx).
Table("data_table").
Where("id = ?", id).
Update("status", status).Error
}
九、Go 服务开发标准流程(后台解析/消费任务)
1. 任务启动流程
- 加载配置
- 初始化DB/客户端连接
- 启动后台协程
- 监听退出信号,安全关闭
go
func StartServer(ctx context.Context, conf Config) error {
// 初始化DB
InitDB()
// 初始化配置
InitConfig(conf)
// 启动解析任务
go StartCycleTask(ctx)
// 阻塞等待退出
<-ctx.Done()
return nil
}
2. 生产者 - 消费者模型(日志解析/数据处理)
- 生产者:从DB/队列读取待处理数据
- 消费者:并发解析、处理、更新结果
- 控制:并发数、定时、退出信号
go
// 生产者:取数据
func Producer(ctx context.Context) []Task {
return QueryUnProcessData(ctx, 100)
}
// 消费者:处理数据
func Consumer(ctx context.Context, task Task) {
// 1. 解析日志
logData, _ := ParseLog(task.Content)
// 2. 提取字段/计算
task.Result = logData.Content
// 3. 上传/存储
task.URL = UploadFile(task.FilePath)
// 4. 更新DB
UpdateData(ctx, task.ID, task)
}
// 主流程
func RunTask(ctx context.Context) {
tasks := Producer(ctx)
HandleTask(ctx, tasks)
}
十、Go 编码与服务维护规范
- 首字母大小写:大写=公开,小写=包内私有
- 错误处理:必须判断 error,不忽略
- 协程安全:使用 WaitGroup / 互斥锁
- 退出安全:所有循环必须监听 ctx.Done()
- 并发控制:必须限制最大协程数
- 日志规范:使用 ctx 传递链路,方便排查
- 格式化 :
go fmt自动统一代码风格
十一、总结
- 入门极快:Python 简洁 + C++ 性能 + 强类型安全
- 核心语法::= 推导、多返回值、defer、context、sync.WaitGroup
- 数据结构:切片(动态数组)、Map(字典)、结构体(业务模型)
- 服务开发:定时任务、并发消费、日志解析、DB操作、HTTP接口
- 维护简单:语法统一、无冗余特性、退出安全、并发可控、格式统一