当前位置: 首页 > news >正文

Go语言入门学习笔记

📚 前言

欢迎学习Go语言!这份教材假设您是编程零基础,从最基本的概念开始讲解。Go语言(也称为Golang)由Google开发,简单、高效、并发能力强,适合后端开发、系统编程和云计算。

学习建议

  • 环境准备:安装Go 1.21+(官网:https://go.dev/dl/),推荐VS Code编辑器 + Go扩展。
  • 学习方法:每章后完成练习,动手敲代码。
  • 时间安排:每天1-2小时,3-4个月完成。
  • 资源:Go官方游乐场(play.golang.org)用于在线测试代码。

第1章:Go语言基础与环境搭建

1.1 什么是Go语言?

Go是一种静态类型、编译型语言,诞生于2009年。特点:

  • 简单:语法简洁,像Python一样易读。
  • 高效:运行速度接近C++。
  • 并发:内置goroutine支持多任务。
  • 用途:Web服务器、工具脚本、云计算(Kubernetes就是用Go写的)。

1.2 安装与环境配置

  1. 下载安装

    • Windows:下载MSI安装器,安装后自动配置环境变量。
    • macOS:下载PKG或用Homebrew brew install go
    • Linux:下载tar.gz,解压到/usr/local/go,添加环境变量。
  2. 配置环境变量(手动):

    • GOROOT:Go安装目录(例如/usr/local/go)。
    • GOPATH:工作目录(例如$HOME/go)。
    • PATH:添加$GOROOT/bin$GOPATH/bin

    示例(在.bashrc.zshrc中):

    export GOROOT=/usr/local/go
    export GOPATH=$HOME/go
    export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
    source ~/.bashrc
    
  3. 验证

    go version  # 输出 go1.21.x
    go env     # 查看配置
    

1.3 第一个程序

创建hello.go

package main  // 每个Go文件必须声明包import "fmt"  // 导入fmt包,用于打印func main() {  // main函数是程序入口fmt.Println("Hello, Go!")  // 打印输出
}

运行:

go run hello.go  # 直接运行
go build hello.go  # 编译成可执行文件
./hello  # 执行(Windows为hello.exe)

练习:修改程序,输入你的名字并打印问候语。


第2章:变量、数据类型与运算符

2.1 变量声明

Go是静态类型语言,变量必须有类型。

var name string = "Alice"  // 显式声明
age := 25  // 短变量声明(自动推导类型)var (  // 批量声明x inty float64 = 3.14
)

2.2 基本数据类型

  • 整数:int(平台相关,通常64位)、int8、int16、int32、int64、uint(无符号)。
  • 浮点:float32、float64。
  • 布尔:bool(true/false)。
  • 字符串:string(不可变,UTF-8编码)。
  • 常量:const pi = 3.14159(编译时确定)。

示例:

var isActive bool = true
fmt.Println("Pi:", pi)

2.3 运算符

  • 算术:+、-、*、/、%(取余)。
  • 比较:==、!=、>、<、>=、<=。
  • 逻辑:&&(与)、||(或)、!(非)。
  • 位运算:&、|、^、<<、>>(了解即可)。

示例:

a := 10
b := 3
sum := a + b  // 13
mod := a % b  // 1
fmt.Println(sum > mod)  // true

练习:编写程序计算圆的面积(面积 = pi * r^2),r从用户输入。


第3章:控制结构

3.1 条件语句

if age >= 18 {fmt.Println("Adult")
} else if age >= 13 {fmt.Println("Teen")
} else {fmt.Println("Child")
}
  • 支持初始化语句:if x := 10; x > 5 { ... }

3.2 循环语句

Go只有for循环:

// 无限循环
for {// ...break  // 退出
}// 传统for
for i := 0; i < 5; i++ {fmt.Println(i)  // 0到4
}// 范围循环(类似foreach)
nums := []int{1,2,3}
for index, value := range nums {fmt.Printf("Index: %d, Value: %d\n", index, value)
}

3.3 switch语句

day := "Monday"
switch day {
case "Monday":fmt.Println("Start of week")
case "Friday":fmt.Println("Weekend soon")
default:fmt.Println("Midweek")
}
  • 支持fallthrough(显式继续下一个case)。

练习:实现一个简单计算器,支持+、-、*、/,使用switch处理操作符。


第4章:函数与错误处理

4.1 函数定义

func add(a int, b int) int {  // 参数类型后置,返回类型return a + b
}// 多返回值
func divide(a, b float64) (float64, error) {if b == 0 {return 0, fmt.Errorf("division by zero")}return a / b, nil
}// 调用
result, err := divide(10, 0)
if err != nil {fmt.Println("Error:", err)
}

4.2 匿名函数与闭包

func main() {multiply := func(x, y int) int { return x * y }fmt.Println(multiply(2, 3))  // 6// 闭包counter := func() func() int {i := 0return func() int {i++return i}}()fmt.Println(counter())  // 1fmt.Println(counter())  // 2
}

4.3 defer、panic与recover

  • defer:函数结束时执行(常用于清理)。
func main() {defer fmt.Println("Deferred")  // 最后执行fmt.Println("Main")
}
  • panic:抛出异常。
  • recover:捕获panic。
func safeDivide(a, b int) {defer func() {if r := recover(); r != nil {fmt.Println("Recovered:", r)}}()if b == 0 {panic("division by zero")}fmt.Println(a / b)
}

练习:编写一个函数,读取文件内容,使用defer关闭文件。


第5章:数组、切片与Map

5.1 数组

固定长度,值类型。

var arr [3]int = [3]int{1, 2, 3}
fmt.Println(arr[0])  // 1// 多维数组
matrix := [2][2]int{{1,2}, {3,4}}

5.2 切片(Slice)

动态数组,引用类型。

slice := []int{1, 2, 3}  // 切片字面量
slice = append(slice, 4)  // 添加元素sub := slice[1:3]  // 子切片(2,3)
fmt.Println(len(slice), cap(slice))  // 长度4,容量4
  • make创建:make([]int, 3, 5)(长度3,容量5)。

5.3 Map(字典)

键值对,无序。

m := make(map[string]int)
m["age"] = 25
delete(m, "age")// 检查存在
val, ok := m["age"]
if ok {fmt.Println(val)
}// 遍历
for key, value := range m {fmt.Printf("%s: %d\n", key, value)
}

练习:实现一个学生成绩管理系统,使用Map存储姓名-分数,使用切片排序输出。


第6章:结构体、方法与接口

6.1 结构体(Struct)

自定义类型。

type Person struct {Name stringAge  int
}p := Person{Name: "Bob", Age: 30}
p.Age = 31  // 修改字段
fmt.Println(p)  // {Bob 31}

6.2 方法

函数绑定到结构体。

func (p Person) Greet() string {  // 值接收者return "Hello, " + p.Name
}func (p *Person) Birthday() {  // 指针接收者(可修改)p.Age++
}fmt.Println(p.Greet())  // Hello, Bob
p.Birthday()
fmt.Println(p.Age)  // 32

6.3 接口

定义行为。

type Shape interface {Area() float64
}type Circle struct {Radius float64
}func (c Circle) Area() float64 {return 3.14 * c.Radius * c.Radius
}func PrintArea(s Shape) {fmt.Println(s.Area())
}PrintArea(Circle{Radius: 5})  // 78.5
  • 空接口interface{}:任意类型(类似any)。

练习:定义Rectangle结构体,实现Shape接口,计算面积和周长。


第7章:并发编程

Go的核心优势:轻量级线程(goroutine)。

7.1 Goroutine

func task() {fmt.Println("Task running")
}func main() {go task()  // 异步执行time.Sleep(time.Second)  // 等待
}

7.2 Channel

goroutine间通信。

ch := make(chan int)  // 无缓冲channelgo func() {ch <- 42  // 发送close(ch)
}()val := <-ch  // 接收
fmt.Println(val)
  • 缓冲channel:make(chan int, 10)

7.3 select与同步

select {
case v := <-ch1:fmt.Println(v)
case v := <-ch2:fmt.Println(v)
default:fmt.Println("No data")
}
  • sync包:Mutex、WaitGroup。
var wg sync.WaitGroup
wg.Add(1)
go func() {defer wg.Done()// 任务
}()
wg.Wait()

练习:使用goroutine和channel实现生产者-消费者模式。


第8章:包管理与模块

8.1 包(Package)

  • 每个目录是一个包。
  • 导入:import "fmt"import mypkg "github.com/user/mypkg"

8.2 Go Modules

现代化依赖管理(Go 1.11+)。

go mod init example.com/myapp  # 初始化
go get github.com/gin-gonic/gin  # 添加依赖
go mod tidy  # 清理

8.3 标准库概览

  • fmt:格式化I/O。
  • os:系统操作。
  • net/http:HTTP客户端/服务器。
  • encoding/json:JSON处理。

示例:简单HTTP服务器。

import "net/http"func main() {http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {fmt.Fprint(w, "Hello, Web!")})http.ListenAndServe(":8080", nil)
}

练习:创建一个包,实现数学工具函数,并导入到主程序。


第9章:错误处理、测试与性能优化

9.1 高级错误处理

使用errors包或自定义错误类型。

type MyError struct {Msg string
}func (e *MyError) Error() string {return e.Msg
}

9.2 测试

文件以_test.go结尾。

// math_test.go
func TestAdd(t *testing.T) {if add(2, 3) != 5 {t.Error("Expected 5")}
}

运行:go test

基准测试:

func BenchmarkAdd(b *testing.B) {for i := 0; i < b.N; i++ {add(2, 3)}
}

9.3 性能优化

  • 使用pprof:go tool pprof分析CPU/内存。
  • 避免不必要分配。
  • 并发优化:减少锁争用。

练习:为上一章的包编写单元测试和基准测试。


第10章:实战项目与进阶主题

10.1 实战项目:RESTful API服务器

使用Gin框架 + GORM(数据库)。

  1. 安装:go get github.com/gin-gonic/gingo get gorm.io/gorm
  2. 结构:用户CRUD API。
// main.go
import ("github.com/gin-gonic/gin""gorm.io/gorm""gorm.io/driver/sqlite"
)type User struct {gorm.ModelName string
}func main() {db, _ := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})db.AutoMigrate(&User{})r := gin.Default()r.GET("/users", func(c *gin.Context) {var users []Userdb.Find(&users)c.JSON(200, users)})r.POST("/users", func(c *gin.Context) {var user Userc.BindJSON(&user)db.Create(&user)c.JSON(200, user)})r.Run(":8080")
}

扩展:添加认证(JWT)、日志。

10.2 进阶主题

  • 反射(reflect包):动态类型检查。
  • gRPC:RPC框架。
  • 微服务:结合Docker/Kubernetes。
  • WebAssembly:Go编译到浏览器。

10.3 部署与CI/CD

  • Docker:编写Dockerfile,构建镜像。
  • GitHub Actions:自动化测试/部署。

最终项目:构建一个完整的博客系统,包括前后端分离(Go后端 + 简单HTML前端)。


📚 推荐学习资源

  • 官方:https://go.dev/learn/(教程)、https://go.dev/doc/effective_go(最佳实践)。
  • 书籍:《The Go Programming Language》(入门经典)、《Go Web编程》(实战)。
  • 视频:Udemy “Go: The Complete Developer’s Guide”、YouTube “Gopher Academy”。
  • 练习平台:LeetCode(Go标签)、Exercism.io Go轨道。
  • 社区:Reddit r/golang、Stack Overflow。
http://www.dtcms.com/a/361082.html

相关文章:

  • 如何将照片从电脑传输到安卓设备
  • GitHub 宕机自救指南:应急解决方案与替代平台
  • LeetCode 165. 比较版本号 - 优雅Java解决方案
  • 【JavaScript】async/await 与 Fetch 传参,PUT,PATCH,文件上传,批量删除等前端案例
  • 《WINDOWS 环境下32位汇编语言程序设计》第10章 内存管理和文件操作(1)
  • 在Lumerical FDTD中,磁偶极子通常用于激发TE模式,而电偶极子用于激发TM模式(文心一言)
  • PyCharm中Debug在状态栏显示运行到光标处(run to cursor)
  • 【MySQL基础】MySQL核心操作全解析
  • 会员店谢幕,补贴战上膛:盒马新十年演绎阿里即时零售战略
  • shell脚本函数介绍
  • (9.1)Python测试之记录
  • 面试 TOP101 动态规划专题题解汇总Java版(BM62 —— BM82)
  • 【数学建模学习笔记】数据标准化
  • NUC029芯片解密和产品应用介绍
  • 玻璃门轻松更换智能密码锁,对接会议预约小程序的方法
  • 美术馆预约小程序|基于微信小程序的美术馆预约平台设计与实现(源码+数据库+文档)
  • Jenkins大总结 20250901
  • 今日分享:C++ -- vector
  • Linux 进程状态 — 僵尸进程
  • keil MDK如何使用第三方软件Keil2Json.exe生成compile_commands.json文件,方便vscode+clangd环境使用
  • Java面试-微服务(业务问题)
  • C#在物联网GPS经纬度转换为百度地图地址
  • 再见 K8s!3款开源的云原生部署工具
  • NetCoreKevin-DDD-微服务-WebApi-AI智能体、AISK集成、MCP协议服务、SignalR、Quartz 框架-15-认证与安全
  • DevExpress WinForms中文教程:Data Grid - 过滤编辑器
  • Spring事务管理策略对比与性能优化实践指南
  • k8s--etcd
  • CTFshow系列——命令执行web73-77(完结篇)
  • LeetCode Hot 100 Python (41~50)
  • .NET 微服务日志系统:Serilog + Loki + Grafana 实践指南