批量上传,套装书可能不全,下单前咨询在线客服!有特殊要求,下单前请咨询客服!
¥ 72.6 4.9折 ¥ 149 全新
库存88件
作者张朝明、李奕锋、甘海彬
出版社清华大学出版社
ISBN9787302649106
出版时间2024-01
装帧平装
开本16开
定价149元
货号29661683
上书时间2024-11-04
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日
《深入浅出Go语言核心编程》是一本全面而深入的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语言的本质,既适合初次接触Go语言的新手,也适合有一定经验的软件开发人员阅读。
张朝明
前金山软件技术总监,部就职于多家互联网企业,拥有近20年的软件开发和设计经验,尤其擅长Golang、Java等编程语言,著有《XML开发典型应用:数据标记、处理、共享与分析》 《21天学通Oracle》《Oracle入门很简单》等书。
李奕锋
某头部互联网公司Go研发工程师,曾任金山游戏高级软件工程师。拥有丰富的分布式、高并发、大规模微服务集群的开发设计经验,在企业应用、游戏社区等领域参与过大型Go项目设计开发工作。
甘海彬
曾先后在魅族、西山居任职高级研发工程师,现于金山办公担任研发经理,对开发企业级应用有着丰富经验。擅长语言Go、Java语言以及全栈开发,对分布式架构、高并发微服务设计有深刻理解。
目 录
第1章 第一个Go程序 1
1.1 搭建开发环境 1
1.2 一个简单的Go程序 3
1.2.1 编写第一个Go程序 3
1.2.2 运行第一个Go程序 5
1.3 环境变量说明 6
1.4 在IDE中运行Go语言程序 7
1.4.1 创建项目 7
1.4.2 创建Go程序文件 8
1.4.3 运行.go文件 9
1.5 Go语言如何实现跨平台 9
1.5.1 跨平台的准备工作 9
1.5.2 执行跨平台编译 10
1.6 探寻Go语言程序的编译执行过程 11
1.6.1 go build命令的选项 11
1.6.2 查看编译的详细过程 11
1.6.3 链接环节 13
1.7 编程范例——启动参数的使用 14
1.7.1 程序启动的入口函数 14
1.7.2 获取启动参数 15
1.8 本章小结 19
第2章 变量与常量 20
2.1 变量 20
2.1.1 变量声明 20
2.1.2 变量赋值 21
2.1.3 同时进行变量声明和赋值 23
2.1.4 多重赋值与“:=”操作符 24
2.1.5 没有多余的局部变量 25
2.1.6 全局变量 25
2.1.7 全局变量与链接 26
2.2 常量 26
2.2.1 常量的声明 26
2.2.2 常量块的使用 27
2.2.3 常量可以声明而不使用 28
2.3 iota与枚举 28
2.3.1 iota实现自增 28
2.3.2 iota计数不会中断 30
2.3.3 iota的使用场景 31
2.4 编程范例——iota的使用技巧 32
2.5 本章小结 34
第3章 简单数据类型 35
3.1 整型 35
3.1.1 声明整型变量 35
3.1.2 int和uint的设计初衷 36
3.2 浮点型 37
3.2.1 声明浮点型变量 37
3.2.2 浮点型会产生精度损失 37
3.2.3 Go语言中没有float关键字的原因 38
3.2.4 浮点型与类型推导 38
3.2.5 浮点型的比较 39
3.3 布尔类型 40
3.4 字符型 40
3.4.1 声明字符型变量 41
3.4.2 转义字符 42
3.5 字符串类型 43
3.5.1 声明字符串变量 43
3.5.2 字符串在磁盘中的存储 43
3.5.3 字符串在内存中的存储 44
3.5.4 利用rune类型处理文本 45
3.5.5 rune类型与字符集的关系 46
3.6 数组类型 46
3.6.1 声明数组变量 47
3.6.2 利用索引来访问数组元素 47
3.6.3 数组大小不可变更 48
3.6.4 数组作为函数参数 48
3.7 编程范例——原义字符的使用 49
3.8 本章小结 50
第4章 复杂数据类型 51
4.1 值类型和指针类型 51
4.1.1 值类型和指针类型的存储结构 51
4.1.2 为什么要区分值类型和指针类型 53
4.1.3 关于引用类型 54
4.2 slice(切片)的使用及实现原理 54
4.2.1 切片如何实现大小可变 54
4.2.2 切片的声明和定义 55
4.2.3 切片长度的扩展 56
4.2.4 切片容量的扩展 57
4.2.5 切片参数的复制 58
4.2.6 利用数组创建切片 60
4.2.7 利用切片创建切片 62
4.2.8 切片元素的修改 62
4.2.9 切片的循环处理 63
4.2.10 切片索引越界 63
4.2.11 总结切片操作的底层原理 64
4.3 map(映射)的使用及实现原理 65
4.3.1 声明和创建map 65
4.3.2 遍历map中的元素 65
4.3.3 元素查找与避免二义性 66
4.3.4 删除元素 67
4.3.5 map的存储结构解析 68
4.3.6 map元素的定位原理解析 70
4.3.7 map的容量扩展原理解析 72
4.4 channel(通道)的使用及实现原理 72
4.4.1 channel的使用 72
4.4.2 channel的实现原理 74
4.4.3 channel与消息队列、协程通信的对比 76
4.5 自定义结构体 76
4.5.1 自定义数据类型和自定义结构体 76
4.5.2 自定义结构体的使用 77
4.5.3 利用new创建实例 78
4.5.4 从自定义结构体看访问权限控制 79
4.5.5 自描述的访问权限 80
4.6 编程范例——结构体使用实例 80
4.6.1 利用自定义结构体实现bitmap 80
4.6.2 利用timer.Ticker实现定时任务 84
4.7 本章小结 87
第5章 流程控制 88
5.1 分支控制 88
5.1.1 if语句实现分支控制 88
5.1.2 switch语句实现分支控制 89
5.1.3 分支控制的本质是向下跳转 90
5.1.4 避免多层if嵌套的技巧 91
5.2 循环控制 94
5.2.1 for循环 94
5.2.2 for-range循环 95
5.2.3 循环控制的本质是向上跳转 97
5.2.4 循环和递归的区别 98
5.3 跳转控制 99
5.3.1 goto关键字的使用 99
5.3.2 goto的本质是任意跳转 101
5.4 编程范例——流程控制的灵活使用 101
5.4.1 for循环的误区 101
5.4.2 switch-case的灵活使用 104
5.5 本章小结 106
第6章 函数 107
6.1 函数在Go语言中的地位 107
6.1.1 Go语言中函数和方法的区别 108
6.1.2 重新理解变量声明中数据类型出现的位置 109
6.2 函数的定义 110
6.2.1 函数的参数 110
6.2.2 函数的返回值 111
6.2.3 函数多返回值的实现原理 113
6.3 函数的管理——模块和包 115
6.3.1 函数管理形式 115
6.3.2 模块与文件夹 116
6.3.3 本地包管理 119
6.3.4 模块名与文件夹名称 121
6.3.5 代码规范的意义 123
6.4 函数的调用和执行 123
6.4.1 包的别名与函数调用 123
6.4.2 init()函数与隐式执行顺序 125
6.4.3 利用init()函数执行初始化 126
6.4.4 利用匿名包实现函数导入 127
6.5 将函数作为变量使用 128
6.5.1 将函数赋值给变量 128
6.5.2 函数赋值给变量的应用场景 129
6.6 匿名函数和闭包 132
6.6.1 为什么需要匿名函数 132
6.6.2 闭包 134
6.7 函数的强制转换 137
6.7.1 从数据类型的定义到函数类型的定义 137
6.7.2 从数据类型的强制转换到函数类型的强制转换 138
6.7.3 函数类型及强制转换的意义 138
6.7.4 利用强制转换为函数绑定方法
— 没有更多了 —
以下为对购买帮助不大的评价