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.pswp.cn/pingmian/95120.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gradle安装、配置环境变量、配置阿里源及idea 中配置gradle

下载gradle https://services.gradle.org/distributions/ 配置系统环境变量 新增GRADLE_HOME D:\Information_Technology\App\gradle-8.14.3-bin\gradle-8.14.3 新增GRADLE_USER_HOME D:\Information_Technology\App\gradleHouse 设置 path&#xff0c;新增一行 %GRADLE_…

C# FlaUI win 自动化框架,介绍

一、简洁介绍 FlaUI 是一套基于 .NET 的 Windows 桌面应用自动化测试库&#xff0c;支持 Win32、WinForms、WPF、UWP 等多种类型的应用。它基于微软原生 UI Automation 库&#xff0c;提供了更现代、易用的 API&#xff0c;适合自动化测试工程师和开发者实现高效、可维护的 UI …

命名空间级别应用 Pod 安全标准

&#x1f3af; 命名空间级别应用 Pod 安全标准 一、创建 Kubernetes 集群&#xff08;使用 kind&#xff09; 使用 kind &#xff08;Kubernetes IN Docker&#xff09;快速创建一个本地集群&#xff1a; kind create cluster --name my-cluster验证集群是否运行正常&#xff1…

Ubuntu 25.10 Snapshot4 发布。

Ubuntu 25.10 的第四个快照&#xff08;Snapshot 4&#xff09;已于 2025 年 8 月 28 日发布&#xff0c;供开发者和测试人员进行验证。这是 Ubuntu 25.10 正式发布前的最后一个月度快照&#xff0c;标志着该版本已进入功能冻结阶段&#xff0c;预计将在 10 月发布正式版。 Ca…

STM32F2/F4系列单片机解密和芯片应用介绍

STM32F2/F4系列单片机解密和芯片应用介绍STM32F2和STM32F4系列微控制器凭借其出色的性能、丰富的外设接口和强大的连接能力&#xff0c;在很多对计算能力和实时性有要求的领域都有应用。同时&#xff0c;芯片解密的价格因其型号、加密技术等因素差异较大。&#x1f9ed; 重要提…

250901-BookStack跨服务器从Rootless-Docker到Rootful-Docker的备份迁移及服务启动

下面给你一套「可离线、最小停机」的迁移步骤&#xff0c;从 A&#xff08;rootless&#xff09;搬到 B&#xff08;rootful&#xff09;。思路是&#xff1a;停 A → 打包数据卷 → 传到 B → 还原 → 用同版本镜像启动 → 验证。整套操作不依赖公网&#xff0c;只用你已有的离…

(Redis)Redis 分布式锁及改进策略详解

一、为什么需要分布式锁在单机应用中&#xff0c;synchronized 或 ReentrantLock 足以解决并发问题。但在 分布式系统 中&#xff0c;多台服务器之间共享同一个资源时&#xff0c;如果没有锁&#xff0c;很可能出现 超卖、重复扣减、数据不一致 等问题。 因此&#xff0c;分布式…

Linux应用开发-windows,linux环境下相关工具

VS Code Remote - SSH 虚拟机部分的操作 sudo systemctl status sshsudo apt update sudo apt install openssh-server sudo systemctl start ssh sudo systemctl enable ssh # 设置开机自启hostname -IVS Code部分的操作 安装 Remote - SSH 插件 vscode右下角出现&#xff…

Java泛型通配符详解:搞懂?/extends/super用法,避开集合操作踩坑点

上次跟你们聊了泛型的基础用法&#xff0c;今天接着往下说 —— 泛型里还有个挺重要的概念叫 “通配符”&#xff0c;就是那个问号 “?”&#xff0c;很多人第一次见都懵&#xff1a;这玩意儿跟普通泛型有啥区别&#xff1f;为啥有时候非得用它不可&#xff1f;小索奇当初也卡…

EXCEL开发之路(二)跨表交互模拟—仙盟创梦IDE

在车辆租赁行业&#xff0c;数据的高效管理与分析对于企业的运营决策、资源调配及客户服务优化至关重要。自建 Excel 实现多表统计交互&#xff0c;如同为行业装上了效能驱动引擎&#xff0c;助力企业在复杂多变的市场环境中稳健前行。一、精准资源管理&#xff0c;优化车辆调配…

医疗AI时代的生物医学Go编程:高性能计算与精准医疗的案例分析(八)

5.4 性能测试与结果分析 为了评估GoEHRStream的性能,我们设计测试模拟真实的医院数据流场景,并测量关键指标。 5.4.1 实验环境 硬件: CPU: Intel Xeon E-2288G (8 cores, 16 threads) RAM: 32 GB DDR4 Storage: 512 GB NVMe SSD (用于GoEHRStream和BadgerDB) Network: 1 G…

开关电源设计“反馈回路”部分器件分析

目录 主要分析问题如下&#xff1a; 一、问题1 二、问题二 分析电路如下&#xff1a; 主要分析问题如下&#xff1a; 1、分析TL431芯片1、2两引脚间并联电阻和电容&#xff08;RC电路&#xff09;的作用&#xff1f; 2、PC817A光耦输入两个引脚间并联电阻的作用&#xff1f;…

AI 编程新玩法:用 yunqi-saas-kit 框架制作小游戏,看广告变现轻松赚钱​

AI 编程新玩法&#xff1a;用 yunqi-saas-kit 框架制作小游戏&#xff0c;看广告变现轻松赚钱 在数字经济快速发展的当下&#xff0c;AI 技术正不断渗透到各个领域&#xff0c;其中 **#AI 编程凭借高效、便捷的优势&#xff0c;成为不少开发者和创业者的新选择。尤其是在小游戏…

Kafka 架构原理

一个kafka集群中包含一个或多个Producer、一个或多个broker、一个或多个ConsumerGrop以及一个Zookeeper集群。kafka通过Zookeeper管理kafka集群配置、leader副本的选举、生产者的负载均衡等。Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消…

用 PyTorch 搭建 CNN 实现 MNIST 手写数字识别

在图像识别领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09; 凭借其对空间特征的高效提取能力&#xff0c;成为手写数字识别、人脸识别等任务的首选模型。而 MNIST&#xff08;手写数字数据集&#xff09;作为入门级数据集&#xff0c;几乎是每个深度学习学习者的 “第…

CTFshow系列——命令执行web61-68

本篇文章介绍了不同了方法进行题目的解析以及原因讲解。 文章目录Web61尝试了一下&#xff0c;被过滤的payload如下&#xff1a;所以&#xff0c;根据上述思路&#xff0c;这里尝试过的payload为&#xff1a;Web62&#xff08;同Web61&#xff09;Web63&#xff08;同Web62&…

.Net程序员就业现状以及学习路线图(二)

一、.NET程序员就业现状分析 1. 市场需求与岗位分布 2025年.NET开发岗位全国招聘职位约1676个&#xff0c;占全国技术岗位的0.009%&#xff0c;主要集中在一线城市如深圳、上海等地。就业单位类型分布为&#xff1a;软件公司占43.3%&#xff0c;研发机构占33.1%&#xff0c;物联…

MTK Linux DRM分析(二十二)- MTK mtk_drm_crtc.c(Part1)

一、代码分析 mtk_drm_crtc.c以mtk_crtc_comp_is_busy函数为界限进行拆分分析 static const struct drm_crtc_funcs mtk_crtc_funcs = {.set_config = drm_atomic_helper_set_config,.page_flip = drm_atomic_helper_page_flip,.destroy = mtk_drm_crtc_destroy,.reset = mtk…

stm32f103c8t6 led闪灯实验

目录 闪灯原理 2种接线方式控制闪灯 使用推挽接法 使用开漏接法 看原理图 写代码 闪灯原理 LED灯有个2-10mA的电流就可以点亮 3.3/5100.006A6mA 2种接线方式控制闪灯 使用推挽接法 当设置推挽模式时&#xff0c;CPU控制寄存器写0&#xff0c;IO引脚输出低电压&#xff0…

“我同意”按钮别乱点——你的“职业EULA”漏洞扫描报告

尊敬的审核&#xff1a; 本人文章《“我同意”按钮别乱点——你的“职业EULA”漏洞扫描报告》 1. 纯属技术交流&#xff0c;无任何违法内容 2. 所有法律引用均来自公开条文 3. 请依据《网络安全法》第12条“不得无故删除合法内容”处理 附&#xff1a;本文结构已通过区块链存证…