深入浅出Go语言核心编程 (张朝明) (Z-Library)
Statistics
5
Views
0
Downloads
0
Donations
Uploader

高宏飞

Shared on 2025年12月14日
Actions

深入浅出Go语言核心编程 (张朝明) (Z-Library)

技术

Author张朝明

深入浅出Go语言的众多关键特性,并提供大量场景示例,对于刚接触或转型Go编程的读者是一本很友好的上手指南。

Publisher: 张朝明
Publish Year: 2024
Language: 英文
File Format: PDF
File Size: 13.1 MB
Support Statistics
¥.00 · 0times
Text Preview (First 20 pages)
Registered users can read the full content for free

Register as a Gaohf Library member to read the complete e-book online for free and enjoy a better reading experience.

(This page has no text content)
目 录 版权信息 作者简介 内容简介 前言 第1章 第一个Go程序 1.1 搭建开发环境 1.2 一个简单的Go程序 1.3 环境变量说明 1.4 在IDE中运行Go语言程序 1.5 Go语言如何实现跨平台 1.6 探寻Go语言程序的编译执行过程 1.7 编程范例——启动参数的使用 1.8 本章小结 第2章 变量与常量 2.1 变量 2.2 常量 2.3 iota与枚举 2.4 编程范例——iota的使用技巧 2.5 本章小结 第3章 简单数据类型 3.1 整型 3.2 浮点型 3.3 布尔类型 3.4 字符型 3.5 字符串类型 3.6 数组类型 3.7 编程范例——原义字符的使用 3.8 本章小结 第4章 复杂数据类型 4.1 值类型和指针类型 4.2 slice(切片)的使用及实现原理
4.3 map(映射)的使用及实现原理 4.4 channel(通道)的使用及实现原理 4.5 自定义结构体 4.6 编程范例——结构体使用实例 4.7 本章小结 第5章 流程控制 5.1 分支控制 5.2 循环控制 5.3 跳转控制 5.4 编程范例——流程控制的灵活使用 5.5 本章小结 第6章 函数 6.1 函数在Go语言中的地位 6.2 函数的定义 6.3 函数的管理——模块和包 6.4 函数的调用和执行 6.5 将函数作为变量使用 6.6 匿名函数和闭包 6.7 函数的强制转换 6.8 编程范例——闭包的使用 6.9 本章小结 第7章 异常处理 7.1 异常机制的意义 7.2 Go语言中的异常 7.3 异常捕获 7.4 异常捕获后的资源清理 7.5 编程范例——异常的使用及误区 7.6 本章小结 第8章 Go语言的面向对象编程 8.1 面向对象编程的本质 8.2 Go语言实现封装 8.3 Go语言实现继承 8.4 Go语言实现多态
8.5 面向接口编程 8.6 编程范例——接口的典型应用 8.7 本章小结 第9章 并发 9.1 线程的概念 9.2 线程模型 9.3 协程的工作原理 9.4 Go语言中的协程同步 9.5 利用channel实现协程同步 9.6 让出时间片 9.7 Go语言中的单例 9.8 编程范例——协程池及协程中断 9.9 本章小结 第10章 上下文 10.1 上下文和普通参数的区别 10.2 上下文树 10.3 利用valueCtx实现信息透传 10.4 利用cancelCtx通知协程终止执行 10.5 利用timerCtx实现定时取消 10.6 编程范例——上下文的典型应用场景 10.7 本章小结 第11章 反射 11.1 反射的意义 11.2 反射的API 11.3 值信息 11.4 编程范例——动态方法调用 11.5 本章小结 第12章 泛型 12.1 泛型的意义 12.2 泛型应用到函数 12.3 泛型导致接口定义的变化 12.4 泛型类型应用到receiver 12.5 编程范例——自定义队列的实现
12.6 本章小结 第13章 I/O 13.1 Reader和Writer 13.2 缓冲区读写 13.3 字符串数据源 13.4 bufio.Scanner的使用 13.5 编程范例——文件系统相关操作 13.6 本章小结 第14章 网络编程 14.1 网络连接的本质 14.2 利用TCP实现网络通信 14.3 利用UDP实现网络通信 14.4 HTTP的相关操作 14.5 数据传输过程 14.6 编程范例——常见网络错误的产生及解决方案 14.7 本章小结 第15章 RPC通信 15.1 如何理解RPC通信 15.2 Gob格式——利用HTTP和TCP实现RPC通信 15.3 JSON格式——利用jsonrpc实现RPC通信 15.4 gRPC格式——利用gRPC实现RPC通信 15.5 编程范例——基于Wireshark理解RPC通信 15.6 本章小结 第16章 内存管理 16.1 内存对齐 16.2 内存分级管理 16.3 Go语言的垃圾回收 16.4 编程范例——unsafe包的使用 16.5 本章小结 第17章 Go语言中的正则表达式 17.1 正则表达式基础 17.2 Go语言中的正则表达式 17.3 Go语言中的正则表达式函数
17.4 编程范例——判断行为序列 17.5 本章小结 第18章 深入理解Go——Plan 9汇编 18.1 Go汇编简介 18.2 从内存角度看函数的调用过程 18.3 寄存器与内存布局 18.4 第一个Go汇编程序Go汇编语言的一大特点就是能够与.go文件结合使用。下面通过一 个实例来演示如何利用 18.5 利用Go汇编定义变量 18.6 利用Go汇编定义函数 18.7 Go汇编中的流程控制 18.8 重新理解多返回值 18.9 编程范例——理解常用寄存器 18.10 本章小结 第19章 Gin处理HTTP请求及响应 19.1 Gin框架简介 19.2 Gin框架与HTTP请求 19.3 Gin框架处理参数 19.4 Gin框架处理响应 19.5 Gin框架的路由处理 19.6 Gin框架的中间件 19.7 编程范例——实现登录认证 19.8 本章小结 第20章 Go语言实现MVC项目 20.1 项目背景 20.2 利用gorm生成MySQL数据表 20.3 实现用户注册 20.4 实现用户登录 20.5 实现用户查询 20.6 实现用户删除 20.7 本章小结
版权信息 书名:深入浅出Go语言核心编程 作者:张朝明 李奕锋 甘海彬 出版社:清华大学出版社 出版时间:2024-01-01 ISBN:9787302649106 ·
作者简介 张朝明 前金山软件技术总监,曾就职于多家互联网企业,拥有近20年的软件开发和设计经验,尤其擅 长Golang、Java等编程语言,著有《XML开发典型应用:数据标记、处理、共享与分析》《21天 学通Oracle》《Oracle入门很简单》等书。 李奕锋 某头部互联网公司Go研发工程师,曾任金山游戏高级软件工程师。拥有丰富的分布式、高并 发、大规模微服务集群的开发设计经验,在企业应用、游戏社区等领域参与过大型Go项目的设 计开发工作。 甘海彬 曾先后在魅族、西山居任职高级研发工程师,现于金山办公担任研发经理,对开发企业级应用 有着丰富经验。擅长Go、Java语言以及全栈开发,对分布式架构、高并发微服务设计有深刻理 解。
内容简介 本书是一本全面而深入的Go语言学习手册,涵盖了Go语言的诸多关键特性,包括语法结构、内 存原理、并发、上下文机制与框架应用等。本书共20章。第1章引导读者快速搭建开发环境,详 细介绍Go语言的环境配置及编译运行的具体细节。第2~5章详细讨论Go语言独特的变量、常 量、常用数据类型和流程控制,并重点解析复杂类型的底层实现机制。第6~8章讲解Go语言的 函数及如何实现面向对象编程,打通Go语言面向过程和面向对象编程之间的桥梁。第9~12章探 讨Go语言的一些高级话题,包括并发、上下文、反射、泛型等。第13~15章探讨Go语言的I/O、 网络编程及RPC通信等编程场景。第16~18章是Go语言的扩展话题,涵盖了内存管理、正则表 达式和Go语言的汇编。第19章和第20章重点探讨了Go语言在日常开发中的典型应用,主要介绍 HTTP框架Gin的使用,以及如何利用Go语言开发一个综合项目。 本书内容丰富,由浅入深,力求带领读者探究Go语言的本质,既适合初次接触Go语言的新手, 也适合有一定经验的软件开发人员阅读。
前言 2007年,Google的开发大师们(Google的Robert Griesemer、Rob Pike和Ken Thompson)推出了 Go语言。此后,它便迅速占领了全球软件开发的前沿阵地。Go语言以其卓越性能、简洁语法和 强大的并发处理能力在全球范围内赢得了无数开发者的推崇与青睐。它集合了众多现代编程语 言的优点,打破了传统的编程范式,展现出了编程语言的新可能。 本书是一本全面而深入的Go语言学习手册,旨在帮助读者全面掌握Go语言——从基础知识到高 级特性,从语法结构到应用实践。本书涉及的内容包括基础语法、异常处理、面向对象编程、 上下文管理、反射、泛型、网络编程、I/O操作、内存管理和Go汇编等方面,形成了一个全方 位、多层次的Go语言学习体系。 本书不仅深入浅出地讲解了Go语言的主要知识点,还特别探讨了Go语言的设计思想和设计者的 意图。即使无法百分之百地探知设计者的思考过程和意图,但通过探讨和理解其设计哲学,我 们也可以站在更高的角度审视问题,更深层次地挖掘知识的底蕴。 在学习的过程中,我们会不断发现,Go语言的设计哲学深深地体现了简洁与实用的原则,其语 法结构、内存管理、并发模型等都展现出了设计者对于软件开发的深刻理解和前瞻性思考。通 过对Go语言的学习,我们不仅能够掌握一门强大的编程语言,还能够更深入地理解编程的本 质,更全面地把握软件开发的全貌。 8年前,当笔者从Java和C++等面向对象编程语言转向Go时,也经历了长时间的不适和挣扎。与 传统的面向对象语言相比,Go语言的很多设计理念和语法结构都有着显著的不同。因此,笔者 特意在本书中穿插讲解了Go语言与其他编程语言的差异,阐述了这些差异背后的设计哲学,希 望能帮助读者更快地理解和接受Go语言,更顺利地完成思维的转变。 同时,笔者深知动手实践的重要性,因此,每一章的知识点都伴有实践性强、易于理解的代码 示例,帮助读者将理论知识转化为实际应用能力。此外,为了方便读者的学习和实践,笔者还 提供了所有示例代码的下载服务,使得学习过程更加顺畅无阻。 本书结构 本书共20章,各章内容概述如下: · 第1章快速引导读者搭建开发环境,并立即进入Go程序的编写和运行阶段。这样做的目的是 让读者对Go语言有一个直接、形象的认识。基于这个初体验,我们深入探讨了Go语言的环境变 量配置以及编译运行的具体细节,从而让读者更深入地了解Go语言在跨平台方面的实现机制。 · 第2章聚焦于Go语言的变量和常量设计,这与其他编程语言有明显不同。例如,Go语言不允 许声明变量而不使用它。本章详细解释了这些设计决策背后的逻辑,以便读者更快地适应Go语 言的独特编码规范。 · 第3章详细介绍Go语言的数据类型。数据类型划分为简单类型和复杂类型两大类,本章介绍 了数值、字符串、布尔值和数组等简单类型。 · 第4章深入剖析各种复杂数据类型的底层实现机制,以帮助读者理解Go语言在数据结构设计 上的优雅和高效。 · 第5章详细解读Go语言的流程控制特性。为了更清晰地呈现流程控制的本质,本章将所有流 程控制语句统一归纳为“跳转”这一概念,并着重强调Go语言在语法设计上的简洁性,以避免其 他编程语言中复杂的语法结构给程序员带来的困扰。 · 第6章集中讨论Go语言中的函数设计。函数不仅支持面向过程的编程风格,还兼容面向对象 的方法调用。本章还深入分析了Go函数中的参数和返回值的声明顺序与其他编程语言的不同之
处,以及这种设计的原因,以帮助熟悉其他编程语言的读者更顺畅地转向Go语言。 · 第7章着重介绍Go语言的异常处理机制。Go语言的异常可以看作一种携带消息的对象,并能 自动传播。通过使用defer关键字即可保证异常情况下的代码执行,从而大大简化了异常处理流 程。 · 第8章深入探讨Go语言的面向对象编程特性。虽然Go语言支持面向对象编程的大部分特性, 但大多数实现都以变通的方式完成。本章详细解释Go语言在面向对象编程方面与其他语言的区 别,旨在使读者对这些特性有更深入的了解。 · 第9章专注于Go语言的并发控制机制。Go语言天然支持协程,与多线程编程有明显不同。从 线程模型出发,本章详细讲解Go语言高并发的原理和实现,同时也花费大量篇幅来讲述如何在 Go语言中实现有效的并发控制。 · 第10章深入探讨Go语言独特的上下文(Context)机制。Go语言中的上下文不仅用于信息传 递,更关键的是,它为父子协程之间的灵活控制提供了强有力的手段。这种机制高效地解决了 父子协程的协作问题,使得多线程编程更为高效和安全。 · 第11章全面解析Go语言中的反射功能,这是大多数现代编程语言都具备的高级特性。通过反 射,开发者能够在运行时进行动态编程,这在编写灵活且可扩展的框架代码时尤其重要。 · 第12章专注于Go语言的新特性——泛型,从泛型的内在逻辑出发,深入剖析Go语言中泛型的 使用方式。同时,也从向后兼容的视角探讨泛型如何影响接口概念,以便读者在更高的抽象层 次上理解Go语言与其他编程语言的差异。 · 第13章以字节操作、字符处理和文本分析为线索,全面阐释I/O操作的各个方面。本章特别强 调了bufio.Scanner在文本解析中的应用,使读者能够对I/O操作有全面而深入的了解。 · 第14章针对网络编程,深入探讨TCP和UDP这两种主要的通信协议。通过大量示例和通信流 程的细致分解,不仅向读者展示了如何编写代码,更使得读者对网络通信的底层原理有更深的 认识。另外,通过代码模拟,详解了常见网络错误的成因和解决策略。 · 第15章以传输协议和消息格式为核心,清晰地划分了各种RPC(远程过程调用)通信方式的 差异,并从源码角度出发,深入剖析Go语言内置的RPC机制。特别在主流的gRPC通信方面,本 章详细说明了其使用流程和可能遇到的问题,以确保读者能够熟练地应用这一强大的工具。 · 第16章聚焦于Go语言的内存管理,详细讲述内存对齐和分层管理机制。由于Go语言支持自动 垃圾回收,因此本章还专门解析了垃圾回收的标记和清除策略,并与其他编程语言的策略进行 了比较。 · 第17章详细介绍Go语言中正则表达式的应用。每种编程语言在实现正则表达式方面都有其独 特之处,本章不仅讲述了如何使用Go语言的正则表达式,还对其特性进行了全面的解析。 · 第18章深入Go语言的汇编层面,旨在帮助读者更深入地理解Go的底层运行机制。本章以寄存 器为中心,以Go语言和Go汇编的交互为主线,通过丰富的示例,详解程序运行时寄存器和内存 分配的工作原理。 · 第19章讲解常用的HTTP框架——Gin的使用,主要包括Gin框架如何处理HTTP请求和响应、 如何使用路由配置和中间件等内容。 · 第20章将Go语言与MVC开发模式结合起来完成一个独立项目,以便读者能够快速代入开发者 角色,体会Go语言实际开发场景。 本书预备知识 操作系统:
读者应当掌握基本的操作系统,比如Windows操作系统或者macOS操作系统,能在个人计算机上 熟练地安装和卸载软件,能运行计算机的命令行工具。 开发环境: 本书使用的开发环境如下: · 操作系统macOS 10.15.7。 · 开发工具Goland 2022.1.2。 · MySQL 8.0。 源码下载 读者可用微信扫描下方二维码下载本书所有示例的源码。 如果在学习和资源下载的过程中遇到问题,可以发送邮件至booksaga@126.com,邮件主题写“深 入浅出Go语言核心编程”。 读者对象 本书由浅入深,力求带领读者探究Go语言的本质,既适合初次接触Go语言的新手,也适合有一 定经验的软件开发人员阅读。 希望本书不仅是你学习Go语言的工具书,更是你编程生涯中的良师益友。希望你在学习Go语言 的道路上畅通无阻,收获满满,同时也能在Go语言的世界中找到无尽的乐趣和无限的可能,将 你的编程理念和技术水平推向一个新的高度。 最后,由于水平所限,本书难免存在疏漏之处,敬请各位读者批评指正。 编 者 2023年9月29日
第1章 第一个Go程序 Go(全称Golang)语言是Google于2009年11月正式推出的编程语言,很快便因其简洁的语法、 强大的并发能力、良好的安全检查等优点而受到广大开发者的热捧,Go语言在当前热门的云计 算开发领域具有独特优势,很多进入云计算开发领域且之前使用PHP的开发人员都开始转向Go 语言开发。本章将首先介绍Go开发环境的搭建,接着用一个最简单的实例来讲述Go语言程序的 组成,然后介绍如何在IDE中创建Go项目,最后介绍Go程序的编译,以使读者由浅入深地理解 Go语言的特色。 本章内容: 搭建开发环境 最简单的Go程序 环境变量说明 在IDE中运行Go程序 Go语言是如何实现跨平台的 探寻Go语言程序的编译执行过程
1.1 搭建开发环境 绝大多数编程语言都会提供一整套开发、编译和运行的相关工具,这些工具一般包括编译和运行 时的支持库、编译工具,以及其他辅助工具。当然,在底层都离不开操作系统的支撑。Go语言是 一门编译型语言,其编译运行的过程如图1-1所示。 不同的操作系统对运行于其上的应用程序的支持各不相同,因此,各种编程语言都会基于操作系 统提供不同的下载包。 图1-1 Go语言的编译执行流程 Go语言支持包的官方下载地址为: https://golang.google.cn/dl/ 在国内镜像下载地址为: https://studygolang.com/dl 打开下载页面,可以看到如图1-2所示的下载地址列表。下载包的类型分为源码(Source)、压缩 文件(Archive)和安装器(Installer)。
图1-2 Go语言安装包下载地址示例 基于Windows和macOS的下载包,下载后双击即可安装;而Linux操作系统的下载包是压缩包,下 载后需要利用tar命令进行解压。我们可以根据个人操作系统的不同,选择合适的文件。 笔者所使用的操作系统为macOS,编写本书时,Go语言的最新版本为1.20.1,因此,笔者所下载 的下载包和本书实例的运行环境,都将基于1.20.1版本,即图1-2中的【go1.20.1.darwin- arm64.pkg】。 下载并安装Go语言包后,直接在命令行(Windows)或终端(Linux/macOS)执行命令 ${安装目 录}/go version, 以检查是否安装成功。 对于笔者的计算机,默认安装位置为/usr/local/go,因此,在终端执行以下命令进行验证: $ /usr/local/go/bin/go version go version go1.20.1 darwin/amd64 安装成功后,还可将Go安装路径下的bin目录添加到操作系统环境变量PATH中,从而可以直接使 用go命令(直接执行不带绝对路径的命令,实际是从环境变量PATH所定义的目录中进行搜 索)。
1.2 一个简单的Go程序 在完成了Go语言开发环境的搭建后,我们正式开始Go语言的开发之旅。本节以打印一个简单的 字符串“hello Golang”为例,讲述最简单的Go程序的执行,并解析其中每行代码的意义。 1.2.1 编写第一个Go程序 我们在任意文件夹下新建并编辑一个文件——first.go,其文件内容如下: 打开命令行终端(macOS/Linux的Terminal,Windows中的命令行),运行go run命令,执行结果 如下: $ go run first.go hello Golang 下面我们对上述简单Go程序进行解析。 1.声明包名 package main用于声明包名。包是函数的父级结构,用于管理函数。我们知道,所有应用程序都 有一个执行入口,也是程序执行的起点。Go语言要求程序的入口必须是main包下的main方法。因 为first.go是目前唯一的程序文件,所以该文件的包名必须声明为“main”,否则程序将无法正常运 行。 2.导入其他包 import "fmt"用于导入其他包。需要注意的是“fmt”并不是包名,而是一个相对路径。import "fmt"实际是扫描该路径下的所有代码,以获得其中的函数、自定义类型等。相对路径的起点是 Go语言的安装目录(GOROOT)下的src文件夹。在笔者的计算机上,该目录为/usr/local/go/src。 我们可以在命令行中查看该目录,结果如下所示。
通过命令行的输出可以看到,fmt目录下有多个.go文件。利用import "fmt"可以导入fmt目录下的.go 文件中定义的函数。例如,打开print.go文件,可以看到包名为fmt;同时,该文件中还有一个名 为Println的函数。导入该函数后,便可以利用fmt.Println的形式(包名+函数名)进行调用。 需要注意的是,虽然print.go中的包名与该文件所在的目录名相同(均为“fmt”),但是包名和目 录名是两个概念,二者也可以不同,我们将在6.3节进行详细讲述。 3.main()函数 func main()用于声明一个名为main的函数,该函数将作为程序的入口。 4.打印字符串 fmt.Println("hello Golang")作为函数main()的函数体。该语句调用了fmt包中的Println()函数,用于 打印一个固定字符串“hello Golang”。 5.Go程序的基本结构 通过以上分析我们可以看到,一个简单的Go程序的基本结构可以概括为如图1-3所示的样子。
图1-3 first.go代码结构及函数调用示意图 1.2.2 运行第一个Go程序 go run命令是运行.go文件最直接的命令。在first.go所在的目录下,可以利用go run命令直接运行 first.go文件,代码如下: $ go run first.go hello Golang go run命令封装了编译和执行的过程,我们也可以将该命令拆解为两个步骤: 利用go build命令进行编译: 通过输出结果可知,在当前目录下生成了名为first的文件。从文件属性(-rwxr-xr-x)也可以看 出,所有用户都拥有可执行权限(即权限中的x标识位)。同时,也代表该文件是一个可执行文 件。 直接运行first文件(在Windows环境中,双击即可执行文件),其输出如下所示。
$ ./first hello Golang 当然,go build的过程也是一个比较复杂的过程。我们将在“1.6 探寻Go语言程序的编译执行过 程”中详细说明。 注意 可执行文件first的大小为1.8MB,而源码文件first.go仅仅只有75B。我们可以猜想,go build 实际是将所有关联到的源码文件都包含进来,这导致Go语言编译出的可执行文件往往比较大。 Go语言的编译不同于C++或者Java编译后的结果。C++可以引用动态链接库,而Java往往依赖外部 JAR包。
1.3 环境变量说明 在1.1节的内容中,提到了环境变量PATH。PATH的主要作用是帮助我们直接使用go命令,而无须 使用全路径。事实上,PATH与编程语言无关。而在编程语言中,一般都需要个性化的环境变 量,例如在Java中,就需要增加JAVA_HOME变量。而在1.2节的程序中,没有使用任何环境变量 就将程序编译运行成功了。那么,这是否意味着Go语言不需要其他环境变量的支持呢? 其实,Go语言常用的环境变量有两个:GOROOT和GOPATH。 · GOROOT:用于指定Go语言环境的根目录,也就是Go语言的安装目录。除了Go语言的自带工 具外,${GOROOT}/src下所有.go文件中定义的函数都可以被导入和引用,例如1.2节实例中的 fmt.Println()函数。 · GOPATH:用于指定除了GOROOT之外的源码目录。我们同样可以导入并引用${GOPATH}/src 下的.go文件中定义的函数。 默认情况下,我们在操作系统中查看这两个环境变量的值时会发现二者均为空: $ echo $GOROOT $ echo $GOPATH 但这并不意味着Go语言中所需的这两个环境变量不存在,而是Go语言在安装时为它们设置了默 认值。我们可以利用go env命令来查看: 当然,也可以利用export set GOROOT=xxx和export set GOPATH=xxx来修改二者的值。一旦使用 该命令,这两个系统环境变量值就会覆盖go env中的默认值。 提示 直接利用go env命令可以看到所有Go语言内置的环境变量。
The above is a preview of the first 20 pages. Register to read the complete e-book.