从零开始学习 Go 语言
Go 语言(又称 Golang)是由 Google 开发的一种静态强类型、编译型、并发型编程语言。它以其简洁的语法、高效的并发支持和强大的标准库而闻名,非常适合开发高性能的服务器端应用、分布式系统和云计算工具。本文将从零开始,详细介绍如何学习 Go 语言,涵盖基础语法、核心概念、并发编程、工具链和实战项目等内容。
1. Go 语言简介
1.1 Go 语言的特点
-
简洁易学:语法简洁,学习曲线平缓。
-
高效编译:编译速度快,生成的可执行文件性能高。
-
并发支持:内置 Goroutine 和 Channel,简化并发编程。
-
垃圾回收:自动内存管理,减少内存泄漏风险。
-
跨平台:支持 Windows、Linux、macOS 等多种操作系统。
-
丰富的标准库:提供网络、文件、加密、测试等功能的强大标准库。
1.2 Go 语言的应用场景
-
Web 开发:使用 Gin、Echo 等框架开发高性能的 Web 服务。
-
微服务:适合构建分布式系统和微服务架构。
-
云计算:Docker、Kubernetes 等云原生工具都是用 Go 语言开发的。
-
命令行工具:快速开发跨平台的命令行工具。
-
数据处理:适合处理高并发的数据流和实时计算。
2. 环境搭建
2.1 安装 Go
-
访问 Go 官方网站 下载适合操作系统的安装包。
-
安装完成后,验证安装:
go version -
配置环境变量:
-
GOROOT:Go 的安装路径。 -
GOPATH:工作目录,用于存放 Go 项目和第三方库。 -
PATH:将$GOROOT/bin和$GOPATH/bin添加到PATH中。
-
2.2 开发工具
-
IDE:推荐使用 Visual Studio Code(VS Code)或 GoLand。
-
插件:
-
VS Code:安装 Go 插件,支持代码补全、调试和格式化。
-
GoLand:JetBrains 出品的 Go 语言专用 IDE。
-
3. 基础语法
3.1 Hello, World!
package mainimport "fmt"func main() {fmt.Println("Hello, World!")
}
-
package main:定义包名,main包是程序的入口。 -
import "fmt":导入标准库的fmt包,用于格式化输出。 -
func main():程序的入口函数。
3.2 变量与常量
-
变量声明:
var x int = 10 y := 20 // 类型推断 -
常量:
const Pi = 3.14
3.3 数据类型
-
基本类型:
-
整数:
int,int8,int16,int32,int64 -
浮点数:
float32,float64 -
字符串:
string -
布尔值:
bool
-
-
复合类型:
-
数组:
[5]int{1, 2, 3, 4, 5} -
切片:
[]int{1, 2, 3} -
映射:
map[string]int{"apple": 5, "banana": 3} -
结构体:
type Person struct {Name stringAge int }
-
3.4 控制结构
-
条件语句:g
if x > 10 {fmt.Println("x is greater than 10") } else {fmt.Println("x is less than or equal to 10") } -
循环语句:
for i := 0; i < 10; i++ {fmt.Println(i) } -
Switch 语句:
switch x { case 1:fmt.Println("x is 1") case 2:fmt.Println("x is 2") default:fmt.Println("x is unknown") }
3.5 函数
-
定义函数:
func add(a int, b int) int {return a + b } -
多返回值:
func swap(a, b int) (int, int) {return b, a }
4. 并发编程
4.1 Goroutine
-
启动 Goroutine:
go func() {fmt.Println("Running in a goroutine") }()
4.2 Channel
-
无缓冲 Channel:
ch := make(chan int) go func() {ch <- 42 }() fmt.Println(<-ch) -
有缓冲 Channel:
ch := make(chan int, 2) ch <- 1 ch <- 2 fmt.Println(<-ch) fmt.Println(<-ch)
4.3 Select 语句
-
多路复用:
select { case msg1 := <-ch1:fmt.Println(msg1) case msg2 := <-ch2:fmt.Println(msg2) case <-time.After(1 * time.Second):fmt.Println("Timeout") }
5. 标准库
5.1 文件操作
-
读取文件:
data, err := os.ReadFile("file.txt") if err != nil {log.Fatal(err) } fmt.Println(string(data)) -
写入文件:
err := os.WriteFile("file.txt", []byte("Hello, Go!"), 0644) if err != nil {log.Fatal(err) }
5.2 HTTP 服务
-
创建 HTTP 服务器:
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "Hello, World!") }) http.ListenAndServe(":8080", nil)
5.3 JSON 处理
-
序列化:g
type Person struct {Name string `json:"name"`Age int `json:"age"` } p := Person{Name: "Alice", Age: 30} jsonData, _ := json.Marshal(p) fmt.Println(string(jsonData)) -
反序列化:
var p Person json.Unmarshal(jsonData, &p) fmt.Println(p)
6. 工具链
6.1 Go Modules
-
初始化项目:
go mod init my-project -
添加依赖:b
go get github.com/gin-gonic/gin
6.2 测试
-
单元测试:
func TestAdd(t *testing.T) {result := add(2, 3)if result != 5 {t.Errorf("Expected 5, got %d", result)} } -
运行测试:
go test
6.3 性能分析
-
使用 pprof:
import _ "net/http/pprof" go func() {log.Println(http.ListenAndServe("localhost:6060", nil)) }()
7. 实战项目
7.1 命令行工具
-
开发一个文件内容统计器,统计文件中单词和行的数量。
7.2 Web 服务
-
使用 Gin 框架开发一个 RESTful API,支持用户注册、登录和数据查询。
7.3 并发爬虫
-
开发一个并发爬虫,使用 Goroutine 和 Channel 实现并发下载。
8. 进阶学习
8.1 反射与接口
-
使用反射实现动态编程。
-
示例:
func printType(v interface{}) {fmt.Println(reflect.TypeOf(v)) }
8.2 微服务与分布式系统
-
学习使用 Go 开发微服务。
-
了解分布式锁、服务发现、负载均衡等概念。
8.3 性能优化
-
使用
pprof进行性能分析。 -
优化算法和数据结构。
9. 学习资源
9.1 官方文档
-
Go 语言官方文档:https://golang.org/doc/
9.2 在线教程
-
Go by Example:Go by Example
-
A Tour of Go:https://tour.golang.org/
9.3 书籍
-
《Go 语言编程》
-
《Go 语言实战》
-
《Go 语言高级编程》
9.4 视频课程
-
Go 语言基础与实战(B站、慕课网等平台)
-
Go 语言并发编程(YouTube、Udemy)
10. 总结
通过本文的学习,你可以掌握 Go 语言的基础语法、核心概念和开发工具,并能够使用 Go 语言开发实际项目。Go 语言以其简洁、高效和并发支持,成为现代软件开发的重要工具。通过不断学习和实践,你可以逐步掌握 Go 语言的高级特性,成为一名优秀的 Go 开发者!
11. 深入理解 Goroutine 和 Channel
11.1 Goroutine 的调度
-
Go 运行时使用 M:N 调度模型,将多个 Goroutine 映射到少量操作系统线程上。
-
调度器负责 Goroutine 的创建、销毁和上下文切换。
11.2 Channel 的底层实现
-
Channel 是基于环形队列实现的,支持高效的发送和接收操作。
-
无缓冲 Channel 的发送和接收操作是同步的,而有缓冲 Channel 的发送和接收操作是异步的。
11.3 Select 语句的工作原理
-
Select 语句会随机选择一个可执行的 Case,如果所有 Case 都不可执行,则执行 Default 语句(如果有)。
12. 高级并发模式
12.1 Worker Pool
-
使用固定数量的 Goroutine 处理任务,避免资源耗尽。
-
示例:
func worker(id int, tasks <-chan int, results chan<- int) {for task := range tasks {fmt.Printf("Worker %d processing task %d\n", id, task)results <- task * 2} }func main() {tasks := make(chan int, 10)results := make(chan int, 10)for i := 1; i <= 3; i++ {go worker(i, tasks, results)}for i := 1; i <= 5; i++ {tasks <- i}close(tasks)for i := 1; i <= 5; i++ {fmt.Println("Result:", <-results)} }
12.2 Fan-In 和 Fan-Out
-
Fan-Out:将一个 Channel 的数据分发到多个 Goroutine 处理。
-
Fan-In:将多个 Channel 的数据合并到一个 Channel。
13. 错误处理与恢复
13.1 错误处理
-
Go 语言使用返回值来处理错误,通常返回一个值和一个
error类型。 -
示例:
func divide(a, b int) (int, error) {if b == 0 {return 0, fmt.Errorf("division by zero")}return a / b, nil }
13.2 Panic 和 Recover
-
Panic:用于引发运行时错误,导致程序崩溃。
-
Recover:用于捕获 Panic,防止程序崩溃。
-
示例:
func safeFunction() {defer func() {if r := recover(); r != nil {fmt.Println("Recovered from panic:", r)}}()panic("Something went wrong") }
14. 性能优化
14.1 使用 pprof
-
使用
pprof进行 CPU 和内存分析。 -
示例:
import _ "net/http/pprof" go func() {log.Println(http.ListenAndServe("localhost:6060", nil)) }()
14.2 减少内存分配
-
使用对象池(
sync.Pool)复用对象。 -
示例:
var pool = sync.Pool{New: func() interface{} {return make([]byte, 1024)}, }
14.3 优化算法
-
使用更高效的算法或数据结构。
-
示例:将线性查找替换为二分查找。
15. 总结
通过本文的学习,你可以掌握 Go 语言的基础语法、核心概念和开发工具,并能够使用 Go 语言开发实际项目。Go 语言以其简洁、高效和并发支持,成为现代软件开发的重要工具。通过不断学习和实践,你可以逐步掌握 Go 语言的高级特性,成为一名优秀的 Go 开发者!
相关文章:
从零开始学习 Go 语言
Go 语言(又称 Golang)是由 Google 开发的一种静态强类型、编译型、并发型编程语言。它以其简洁的语法、高效的并发支持和强大的标准库而闻名,非常适合开发高性能的服务器端应用、分布式系统和云计算工具。本文将从零开始,详细介绍…...
自由学习记录(45)
顶点片元着色器(important) 1.需要在Pass渲染通道中编写着色器逻辑 2.可以使用cG或HLSL两种shader语言去编写Shader逻辑 3.代码量较多,灵活性较强,性能消耗更可控,可以实现更多渲染细节 4.适用于光照处理较少…...
数据源支持远程Excel/CSV,数据集支持分组字段功能,DataEase开源BI工具v2.10.6 LTS版本发布
2025年3月17日,人人可用的开源BI工具DataEase正式发布v2.10.6 LTS版本。 这一版本的功能变动包括:数据源方面,新增支持远程Excel/CSV数据源,支持以HTTP、HTTPS、FTP协议获取远程服务器上的Excel和CSV数据文件,并且可以…...
SpringBoot3使用CompletableFuture时java.util.ConcurrentModificationException异常解决方案
问题描述 在Spring Boot 3项目中,使用CompletableFuture进行异步编程时,偶发{"code":500,"msg":"java.util.ConcurrentModificationException"}异常,但代码中并未直接操作List或CopyOnWriteArrayList等集合类…...
【Nodejs】2024 汇总现状
之前已经调研了容器、nexus-public,实现了本地构建应用镜像和基础设施的镜像。为实现分布式一体化协作开发的目标,还需要配套的线上协作开发环境。故而重回前端调研现状,比较 5 年前的 nodejs 快好的啊。 以下是针对 Node.js 工具链的深度解析…...
LeetCode 每日一题 2025/3/17-2025/3/23
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 3/17 1963. 使字符串平衡的最小交换次数3/18 2614. 对角线上的质数3/19 2610. 转换二维数组3/20 2612. 最少翻转操作数3/21 2680. 最大或值3/22 2643. 一最多的行3/23 2116…...
STM32__红外避障模块的使用
目录 一、红外避障模块 概述 二、直接读取OUT引脚电平 三、使用中断方式触发 一、红外避障模块 概述 引脚解释: VCC接3.3V 或 5.0VGND接开发板的GNDOUT数字量输出(0或1); 低电平时表示前方有障碍 ; 通过可调电阻调整检测距离 产品特点: …...
android 音量调节
安卓音频数据的最终音量由三部分组成,分别是master volume(全局音量,对整个系统所有的音频数据生效),stream volume(流音量,只针对特定类型的音频数据生效)和track volume(track音量,只针对某个audiotrack的…...
Redis JSON 用id读取content总结(sendCommand())
Redis JSON 读取总结(方法 2 - sendCommand()) 💡 背景 在 Redis 中,我们存储了 JSON 数据,并希望通过 Jedis sendCommand() 方式读取 JSON 里的 "content" 字段。由于 jedis.jsonGet() 可能在旧版本不支持…...
使用Qdrant等其他向量数据库时需要将将numpy 数组转换为列表 确保数据能被正确处理和序列化,避免类型不兼容的问题。
在使用Qdrant等其他向量数据库时需要 转换 numpy 数组为列表主要是为了确保数据能被正确处理和序列化,避免类型不兼容的问题。具体原因如下: 序列化兼容性: 很多数据库接口、API 或者 JSON 序列化工具只能处理 Python 的内置类型(…...
[AI速读]如何构建高效的AMBA协议检查器(Checker IP)
在芯片验证过程中,检查器(Checker)是确保设计符合协议规范的关键工具。本文基于一篇技术论文,分享如何为AMBA协议(如AXI、AHB)构建可重用的检查器IP(Checker IP,简称CIP),并简化其核心思路,帮助工程师快速上手。 一、什么是Checker IP? Checker IP是一组用SystemVe…...
基于3DMax与Vray引擎的轻量级室内场景渲染实践
欢迎踏入3DMAX室内渲染的沉浸式学习之旅!在这个精心设计的实战教程中,我们将携手揭开3DMAX与Vray这对黄金搭档在打造现实室内场景时的核心奥秘。无论您是渴望入门的3D新手,还是追求极致效果的专业设计师,这里都将为您呈现从场景蓝图构建到光影魔法施加的完整技术图谱。我们…...
浅谈Qt事件子系统——以可拖动的通用Widget为例子
浅谈Qt事件子系统——以可拖动的通用Widget为例子 这一篇文章是一个通过实现可拖动的通用Widget为引子简单介绍一下我们的事件对象子系统的事情 代码和所有的文档 1:Qt侧的API介绍和说明 这个是每一个小项目的惯例,我会介绍大部分Qt程序中使用到的…...
QT Quick(C++)跨平台应用程序项目实战教程 2 — 环境搭建和项目创建
目录 引言 1. 安装Qt开发环境 1.1 下载Qt安装包 1.2 安装Qt 1.3 安装MSVC编译器 2. 创建Qt Quick项目 2.1 创建新项目 2.2 项目结构 2.3 运行项目 3. 理解项目代码 3.1 main.cpp文件 3.2 Main.qml文件 引言 在上一篇文章中,我们介绍了本教程的目标和结…...
登山第二十梯:无人机实时自主探索——我是一只小小小鸟
文章目录 一 摘要 二 资源 三 内容 一 摘要 自主探索是无人机 (UAV) 各种应用的基本问题。最近,基于 LiDAR 的探索因其能够生成大规模环境的高精度点云地图而受到广泛关注。虽然点云本身就为导航提供了信息,但许多现有的勘探方…...
Pytorch使用手册—扩展 TorchScript 使用自定义 C++ 操作符(专题五十三)
提示 本教程自 PyTorch 2.4 起已弃用。有关 PyTorch 自定义操作符的最新指南,请参阅 PyTorch 自定义操作符。 PyTorch 1.0 版本引入了一种名为 TorchScript 的新编程模型。TorchScript 是 Python 编程语言的一个子集,可以被 TorchScript 编译器解析、编译和优化。此外,编译后…...
word插入Mathtype公式居中和自动更新
word插入公式自动更新 前提:安装Mathtype 1.word中查看页的宽度 出现如下 2.设置样式 出现这个窗口 给样式随便起个名字 3.修改样式 3.1 设置两个制表位 第二个 3.2 修改公式字体 如下所示 4. 修改公式格式 4.1在word中打开 Mathtype 4.2 修改公式的格式 变成…...
网络层之IP协议
在讨论传输层时, 我们都只讨论了发送方和接收方的问题, 而没有讨论中间的网络形态的问题. 也就是数据包如何从主机传送到主机的? 如图, 主机B发送数据到主机C, 发送报文需要进行路径选择, 主机B-> F-> G-> H-> C-> D -> 主机C 这条路径是如何被选择出来的?…...
基于springboot的旅游网站(013)
摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势,旅游网站当然也不能排除在外,随着旅游网站的不断成熟,它彻底改变了过去传统的旅游网站方式,不仅使旅游管理…...
人工智能 - 在 Spring Boot 中调用 AnythingLLM+DeepSeek 的知识库获取消息接口
整体逻辑: 自建系统的web UI界面调用接口: 1.SpringBoot接口:/anything/chatMessageAnything 2.调用anythingLLM - 调用知识库deepseek r1 . 部署 AnythingLLM DeepSeek 本地知识库 的环境要求如下: 一、硬件要求 CPU 最低:4核&#x…...
体育直播模板nba英超直播欧洲杯直播模板手机自适应
源码名称:体育直播模板nba英超直播欧洲杯直播模板手机自适应帝国cms 7.5模板 开发环境:帝国cms7.5 空间支持:phpmysql 带软件采集,可以挂着自动采集发布,无需人工操作! 模板特点: 程序伪静态…...
STM32-ARM
一、体系架构 ARM里有37个寄存器ALU算数逻辑单元PC程序计数器:指向哪里执行哪里SP栈指针寄存器LR链接寄存器:保存函数入口地址CPSR(current program status register)当前程序状态寄存器:SOSR(CPSR的备份)MMU(内存管理单元)Cache高速缓冲(iCa…...
ripro 主题激活 问题写入授权Token失败,可能无文件写入权限
ripro 主题激活 问题 写入授权Token失败,可能无文件写入权限 找到主题下面的functions.php文件,给其他写入权限。就好了。...
Lustre 语言的 Rust 生成相关的工作
目前 Lustre V6 编译器支持编译生成的语言为C语言。但也注意到,以 Rust 语言为生成目标语言,也存在若干相关工作。 rustre(elegaanz) 该项工作为 Lustre v6 语言的解析器,使用 Rust 语言实现。生成 Lustre AST。 项…...
计算机网络——通信基础和传输介质
物理层任务:实现相邻节点之间比特(0或1)的传输 到了数据链路层之后,它会以帧为单位,把若干个比特交给物理层,物理层需要把这些比特信息转化成信号,在物理传输媒体上进行传输 通信基础基本概念 信…...
python-selenium 爬虫 由易到难
本质 python第三方库 selenium 控制 浏览器驱动 浏览器驱动控制浏览器 推荐 edge 浏览器驱动(不容易遇到版本或者兼容性的问题) 驱动下载网址:链接: link 1、实战1 (1)安装 selenium 库 pip install selenium&#…...
Execution failed for task ‘:path_provider_android:compileDebugJavaWithJavac‘.
What went wrong: Execution failed for task ‘:path_provider_android:compileDebugJavaWithJavac’. Could not resolve all files for configuration ‘:path_provider_android:androidJdkImage’. Failed to transform core-for-system-modules.jar to match attributes {…...
【Linux 维测专栏 2 -- Deadlock detection介绍】
文章目录 kernel 编译选项配置deadlock 测试代码deadlock 测试 logkernel 编译选项配置 通过 menuconfig 配置下面编译选项 # lockdep CONFIG_LOCK_STAT=y CONFIG_PROVE_LOCKING=y CONFIG_DEBUG_LOCKDEP=y上面配置完成后会定义下面宏: CONFIG_LOCK_DEBUGGING_SUPPORT=y CONF…...
T113-i开发板的休眠与RTC定时唤醒指南
在嵌入式系统设计中,休眠与唤醒技术是优化电源管理、延长设备续航的关键。飞凌嵌入式基于全志T113-i处理器开发设计的OK113i-S开发板提供了两种休眠模式:freeze和mem,以满足不同应用场景下的功耗与恢复速度需求。本文将详细介绍如何让OK1…...
Node.js系列(4)--微服务架构实践
Node.js微服务架构实践 🔄 引言 微服务架构已成为构建大规模Node.js应用的主流选择。本文将深入探讨Node.js微服务架构的设计与实现,包括服务拆分、服务治理、通信机制等方面,帮助开发者构建可扩展的微服务系统。 微服务架构概述 Node.js…...
