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

从零开始学习 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

  1. 访问 Go 官方网站 下载适合操作系统的安装包。

  2. 安装完成后,验证安装:

    go version
  3. 配置环境变量:

    • 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 数据类型

  • 基本类型

    • 整数:intint8int16int32int64

    • 浮点数:float32float64

    • 字符串: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 语言&#xff08;又称 Golang&#xff09;是由 Google 开发的一种静态强类型、编译型、并发型编程语言。它以其简洁的语法、高效的并发支持和强大的标准库而闻名&#xff0c;非常适合开发高性能的服务器端应用、分布式系统和云计算工具。本文将从零开始&#xff0c;详细介绍…...

自由学习记录(45)

顶点片元着色器&#xff08;important&#xff09; 1.需要在Pass渲染通道中编写着色器逻辑 2.可以使用cG或HLSL两种shader语言去编写Shader逻辑 3.代码量较多&#xff0c;灵活性较强&#xff0c;性能消耗更可控&#xff0c;可以实现更多渲染细节 4.适用于光照处理较少&#xf…...

数据源支持远程Excel/CSV,数据集支持分组字段功能,DataEase开源BI工具v2.10.6 LTS版本发布

2025年3月17日&#xff0c;人人可用的开源BI工具DataEase正式发布v2.10.6 LTS版本。 这一版本的功能变动包括&#xff1a;数据源方面&#xff0c;新增支持远程Excel/CSV数据源&#xff0c;支持以HTTP、HTTPS、FTP协议获取远程服务器上的Excel和CSV数据文件&#xff0c;并且可以…...

SpringBoot3使用CompletableFuture时java.util.ConcurrentModificationException异常解决方案

问题描述 在Spring Boot 3项目中&#xff0c;使用CompletableFuture进行异步编程时&#xff0c;偶发{"code":500,"msg":"java.util.ConcurrentModificationException"}异常&#xff0c;但代码中并未直接操作List或CopyOnWriteArrayList等集合类…...

【Nodejs】2024 汇总现状

之前已经调研了容器、nexus-public&#xff0c;实现了本地构建应用镜像和基础设施的镜像。为实现分布式一体化协作开发的目标&#xff0c;还需要配套的线上协作开发环境。故而重回前端调研现状&#xff0c;比较 5 年前的 nodejs 快好的啊。 以下是针对 Node.js 工具链的深度解析…...

LeetCode 每日一题 2025/3/17-2025/3/23

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 3/17 1963. 使字符串平衡的最小交换次数3/18 2614. 对角线上的质数3/19 2610. 转换二维数组3/20 2612. 最少翻转操作数3/21 2680. 最大或值3/22 2643. 一最多的行3/23 2116…...

STM32__红外避障模块的使用

目录 一、红外避障模块 概述 二、直接读取OUT引脚电平 三、使用中断方式触发 一、红外避障模块 概述 引脚解释&#xff1a; VCC接3.3V 或 5.0VGND接开发板的GNDOUT数字量输出(0或1&#xff09;; 低电平时表示前方有障碍 ; 通过可调电阻调整检测距离 产品特点&#xff1a; …...

android 音量调节

安卓音频数据的最终音量由三部分组成&#xff0c;分别是master volume(全局音量&#xff0c;对整个系统所有的音频数据生效&#xff09;&#xff0c;stream volume(流音量&#xff0c;只针对特定类型的音频数据生效)和track volume(track音量&#xff0c;只针对某个audiotrack的…...

Redis JSON 用id读取content总结(sendCommand())

Redis JSON 读取总结&#xff08;方法 2 - sendCommand()&#xff09; &#x1f4a1; 背景 在 Redis 中&#xff0c;我们存储了 JSON 数据&#xff0c;并希望通过 Jedis sendCommand() 方式读取 JSON 里的 "content" 字段。由于 jedis.jsonGet() 可能在旧版本不支持…...

使用Qdrant等其他向量数据库时需要将将numpy 数组转换为列表 确保数据能被正确处理和序列化,避免类型不兼容的问题。

在使用Qdrant等其他向量数据库时需要 转换 numpy 数组为列表主要是为了确保数据能被正确处理和序列化&#xff0c;避免类型不兼容的问题。具体原因如下&#xff1a; 序列化兼容性&#xff1a; 很多数据库接口、API 或者 JSON 序列化工具只能处理 Python 的内置类型&#xff08;…...

[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&#xff1a;Qt侧的API介绍和说明 ​ 这个是每一个小项目的惯例&#xff0c;我会介绍大部分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文件 引言 在上一篇文章中&#xff0c;我们介绍了本教程的目标和结…...

登山第二十梯:无人机实时自主探索——我是一只小小小鸟

文章目录 一 摘要 二 资源 三 内容 一 摘要 自主探索是无人机 &#xff08;UAV&#xff09; 各种应用的基本问题。最近&#xff0c;基于 LiDAR 的探索因其能够生成大规模环境的高精度点云地图而受到广泛关注。虽然点云本身就为导航提供了信息&#xff0c;但许多现有的勘探方…...

Pytorch使用手册—扩展 TorchScript 使用自定义 C++ 操作符(专题五十三)

提示 本教程自 PyTorch 2.4 起已弃用。有关 PyTorch 自定义操作符的最新指南,请参阅 PyTorch 自定义操作符。 PyTorch 1.0 版本引入了一种名为 TorchScript 的新编程模型。TorchScript 是 Python 编程语言的一个子集,可以被 TorchScript 编译器解析、编译和优化。此外,编译后…...

word插入Mathtype公式居中和自动更新

word插入公式自动更新 前提&#xff1a;安装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)

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff0c;旅游网站当然也不能排除在外&#xff0c;随着旅游网站的不断成熟&#xff0c;它彻底改变了过去传统的旅游网站方式&#xff0c;不仅使旅游管理…...

人工智能 - 在 Spring Boot 中调用 AnythingLLM+DeepSeek 的知识库获取消息接口

整体逻辑: 自建系统的web UI界面调用接口: 1.SpringBoot接口&#xff1a;/anything/chatMessageAnything 2.调用anythingLLM - 调用知识库deepseek r1 . 部署 AnythingLLM DeepSeek 本地知识库 的环境要求如下&#xff1a; 一、硬件要求 CPU 最低&#xff1a;4核&#x…...

体育直播模板nba英超直播欧洲杯直播模板手机自适应

源码名称&#xff1a;体育直播模板nba英超直播欧洲杯直播模板手机自适应帝国cms 7.5模板 开发环境&#xff1a;帝国cms7.5 空间支持&#xff1a;phpmysql 带软件采集&#xff0c;可以挂着自动采集发布&#xff0c;无需人工操作&#xff01; 模板特点&#xff1a; 程序伪静态…...

STM32-ARM

一、体系架构 ARM里有37个寄存器ALU算数逻辑单元PC程序计数器&#xff1a;指向哪里执行哪里SP栈指针寄存器LR链接寄存器&#xff1a;保存函数入口地址CPSR(current program status register)当前程序状态寄存器&#xff1a;SOSR(CPSR的备份)MMU(内存管理单元)Cache高速缓冲(iCa…...

ripro 主题激活 问题写入授权Token失败,可能无文件写入权限

ripro 主题激活 问题 写入授权Token失败&#xff0c;可能无文件写入权限 找到主题下面的functions.php文件&#xff0c;给其他写入权限。就好了。...

Lustre 语言的 Rust 生成相关的工作

目前 Lustre V6 编译器支持编译生成的语言为C语言。但也注意到&#xff0c;以 Rust 语言为生成目标语言&#xff0c;也存在若干相关工作。 rustre&#xff08;elegaanz&#xff09; 该项工作为 Lustre v6 语言的解析器&#xff0c;使用 Rust 语言实现。生成 Lustre AST。 项…...

计算机网络——通信基础和传输介质

物理层任务&#xff1a;实现相邻节点之间比特&#xff08;0或1&#xff09;的传输 到了数据链路层之后&#xff0c;它会以帧为单位&#xff0c;把若干个比特交给物理层&#xff0c;物理层需要把这些比特信息转化成信号&#xff0c;在物理传输媒体上进行传输 通信基础基本概念 信…...

python-selenium 爬虫 由易到难

本质 python第三方库 selenium 控制 浏览器驱动 浏览器驱动控制浏览器 推荐 edge 浏览器驱动&#xff08;不容易遇到版本或者兼容性的问题&#xff09; 驱动下载网址&#xff1a;链接: link 1、实战1 &#xff08;1&#xff09;安装 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定时唤醒指南

​​在嵌入式系统设计中&#xff0c;休眠与唤醒技术是优化电源管理、延长设备续航的关键。飞凌嵌入式基于全志T113-i处理器开发设计的OK113i-S开发板提供了两种休眠模式&#xff1a;freeze和mem&#xff0c;以满足不同应用场景下的功耗与恢复速度需求。本文将详细介绍如何让OK1…...

Node.js系列(4)--微服务架构实践

Node.js微服务架构实践 &#x1f504; 引言 微服务架构已成为构建大规模Node.js应用的主流选择。本文将深入探讨Node.js微服务架构的设计与实现&#xff0c;包括服务拆分、服务治理、通信机制等方面&#xff0c;帮助开发者构建可扩展的微服务系统。 微服务架构概述 Node.js…...