跳转至

Head First Go语言程序设计-杰伊·麦克格瑞恩

  •  Head First Go语言程序设计|200
  • 书名: Head First Go语言程序设计
  • 作者: 杰伊·麦克格瑞恩
  • 简介: Go是为高性能网络和多处理而设计的, 但与python和javascript一样,该语言易于阅读和使用。通过这本实用的实践指南,读者将学习如何使用演示实际语言的清晰示例来编写Go代码。最重要的是,读者将会了解到用人单位希望入门级Go开发人员所知晓的惯例和技术。主要内容包括语法基础、条件和循环、函数、包、数组、映射、结构、封装和嵌入、接口、故障恢复、共享、自动化测试、Web应用程序等。
  • 出版时间 2020-09-01 00:00:00
  • ISBN: 9787111664932
  • 分类: 计算机-编程设计
  • 出版社: 机械工业出版社

高亮划线

封面

版权页

献言

译者序

作者简介

前言 如何使用这本书

这本书是给谁看的

我们知道你在想什么

我们知道你的大脑在想什么

元认知:思考“何为思考”

我们是这样做的

说明

致谢

O’Reilly在线学习

1 让我们开始吧:语法基础

准备好,出发

Go Playground

这一切意味着什么

如果出了问题怎么办

调用函数

Println函数

使用其他包中的函数

函数返回值

Go程序模板

字符串

符文

布尔值

数字

数学运算与比较

类型

类型(续)

声明变量

声明变量(续)

零值

短变量声明

  • 📌 如果你声明变量时就知道它的初始值是什么,那么更具有代表性的是使用短变量声明。你不必很明确地声明变量的类型并在之后使用=为其赋值,而是同时使用:= ^35-583-655
    • ⏱ 2024-01-31 08:00:35

命名规则

  • 📌 如果变量、函数或类型的名称以大写字母开头,则认为它是导出的,可以从当前包之外的包访问它。(这就是为什么fmt.Println中的P是大写的:这样它就可以在main包或任何其他包中使用。)如果变量/函数/类型的名称是以小写字母开头的,则认为该名称是未导出的,只能在当前包中使用。 ^36-484-622
    • ⏱ 2024-01-31 08:05:59

转换

转换(续)

在你的计算机上安装Go

编译Go代码

Go工具

使用“go run”快速尝试代码

你的Go工具箱

2 接下来运行哪些代码:条件和循环

调用方法

调用方法(续)

评分

函数或方法的多个返回值

选项1:使用空白标识符忽略错误返回值

选项2:处理错误

条件

条件(续)

有条件地记录致命错误

避免遮盖名字

避免遮盖名字(续)

将字符串转换为数字

将字符串转换为数字(续)

将字符串转换为数字(续)

块和变量的作用域

块和变量的作用域(续)

我们已经完成了评分程序

短变量声明中只有一个变量必须是新的

让我们创建一个游戏

包名与导入路径

  • 📌 当我们说math/rand时,我们指的是包的导入路径,而不是它的名称。导入路径只是一个独特的字符串,用于标识包以及在导入语句中使用的包。一旦导入了包,就可以通过其包名来引用它。 ^65-826-914
    • ⏱ 2024-01-31 19:45:46

包名与导入路径(续)

生成随机数

生成随机数(续)

从键盘获取整数

将猜测与目标进行比较

循环

循环(续)

初始化和标志(post)语句是可选的

在我们的猜谜游戏中使用循环

在我们的猜谜游戏中使用循环(续)

中断我们的猜测循环

显示目标

恭喜你,游戏结束了

你的Go工具箱

3 调用:函数

一些重复的代码

使用Printf和Sprintf格式化输出

格式化动词

格式化动词(续)

格式化值宽度

格式化小数宽度

在油漆计算器中使用Printf

声明函数

声明函数参数

在油漆计算器中使用函数

函数和变量的作用域

函数返回值

函数返回值(续)

在油漆计算器中使用返回值

paintNeeded函数需要错误处理

错误值

声明多个返回值

在paintNeeded函数中使用多个返回值

  • 📌 但是对于多个返回值,最常见的用法是返回一个主返回值,后跟一个额外值,表示函数是否遇到错误。如果没有问题,通常将额外值设置为nil,如果发生错误,则设置为错误值。 ^98-414-494
    • ⏱ 2024-01-31 20:04:13

始终处理错误

函数形参接收实参的副本

  • 📌 Go是一种“值传递”语言;函数形参从函数调用中接收实参的副本 ^100-618-648
    • ⏱ 2024-01-31 20:06:37

指针

指针类型

  • 📌 指针的类型可以写为一个符号,后面跟着指针指向的变量的类型。例如,指向一个int变量的指针的类型将被写为int(你可以将其大声读作“指向int的指针”)。 ^102-526-604
    • ⏱ 2024-01-31 20:09:39

获取或更改指针的值

函数指针

使用指针修复我们的“double”函数

你的Go工具箱

4 代码集:包

不同的程序,相同的函数

不同的程序,相同的函数(续)

使用包在程序之间共享代码

Go工作区目录保存包代码

创建一个新包

将包导入程序

包使用相同的文件布局

包命名规范

包限定符

将共享代码移动到包中

将共享代码移动到包中(续)

常量

常量(续)

嵌套的包目录和导入路径

嵌套的包目录和导入路径(续)

使用“go install”安装程序可执行文件

使用GOPATH环境变量更改工作区

设置GOPATH

发布包

发布包(续)

发布包(续)

发布包(续)

使用“go get”下载和安装包

使用“go doc”阅读包文档

使用“go doc”阅读包文档(续)

使用doc注释记录包

使用doc注释记录包(续)

在Web浏览器中查看文档

使用“godoc”提供HTML文档

“godoc”服务器包含你的包

你的Go工具箱

5 列表:数组

数组保存值的集合

数组保存值的集合(续)

数组中的零值

数组字面量

“fmt”包中的函数知道如何处理数组

在循环里访问数组元素

使用“len”函数检查数组长度

使用“for...range”安全遍历数组

在“for...range”循环中使用空白标识符

得到数组中数字之和

得到数组中数字之和(续)

得到数组中数字的平均值

读取文本文件

读取文本文件(续)

读取文本文件(续)

将文本文件读入数组

将文本文件读入数组(续)

更新我们的“average”程序来读取文本文件

更新我们的“average”程序来读取文本文件(续)

我们的程序只能处理三个值

我们的程序只能处理三个值(续)

你的Go工具箱

6 追加的问题:切片

切片

切片(续)

切片字面量

切片运算符

切片运算符(续)

底层数组

修改底层数组,修改切片

使用“append”函数在切片上添加数据

使用“append”函数在切片上添加数据(续)

切片和零值

使用切片和“append”读取额外的文件行

使用切片和“append”读取额外的文件行(续)

尝试我们改进后的程序

出错时返回nil值切片

命令行参数

从os.Args切片获取命令行参数

切片运算符可用于其他切片

更新程序以使用命令行参数

可变长参数函数

可变长参数函数(续)

使用可变长参数函数

使用可变长参数函数计算平均值

向可变长参数函数传递一个切片

向可变长参数函数传递一个切片(续)

切片拯救了我们

你的Go工具箱

7 标签数据:映射

计票

从文件中读取名字

从文件中读取名字(续)

从文件中读取名字(续)

使用困难的切片方法对名字计数

使用困难的切片方法对名字计数(续)

使用困难的切片方法对名字计数(续)

映射

映射(续)

映射字面量

映射中的零值

映射变量的零值是nil

如何区分已经赋值的值和零值

如何区分已经赋值的值和零值(续)

使用“delete”函数删除键/值对

使用映射来更新计票程序

使用映射来更新计票程序(续)

对映射进行for...range循环

对映射进行for...range循环(续)

for...range循环以随机顺序处理映射

使用for...range循环来更新计票程序

计票程序完成

你的Go工具箱

8 构建存储:struct

切片和映射保存一种类型的值

struct是由多种类型的值构建的

使用点运算符访问struct字段

在struct中保存订阅者的数据

定义类型和struct

定义类型和struct(续)

为杂志订阅者定义一个类型

与函数一起使用已定义类型

与函数一起使用已定义类型(续)

使用函数修改struct

使用函数修改struct(续)

通过指针访问struct的字段

通过指针访问struct的字段(续)

使用指针传递大型struct

将struct类型移动到另一个包

定义类型的名称首字母必须大写才能导出该类型

struct字段的名称首字母必须大写才能导出该字段

struct字面量

创建一个Employee struct类型

创建一个Address struct类型

将struct作为字段增加到另一个类型中

在另一个struct中设置struct

在另一个struct中设置struct(续)

在另一个struct中设置struct(续)

匿名struct字段

嵌入struct

我们定义的类型完成了

你的Go工具箱

9 我喜欢的类型:定义类型

现实生活中的类型错误

具有底层基础类型的定义类型

具有底层基础类型的定义类型(续)

定义类型和运算符

使用函数进行类型转换

使用函数进行类型转换(续)

使用方法修复函数名冲突

定义方法

接收器参数(几乎)就是另一个参数

方法(几乎)就像一个函数

指针类型的接收器参数

指针类型的接收器参数(续)

使用方法将Liters和Milliliters转换为Gallons

使用方法将Gallons转换为Liters和Milliliters

你的Go工具箱

10 保密:封装和嵌入

创建一个日期struct类型

人们将Date struct的字段设置为无效值

setter方法

setter方法需要指针接收器

添加其余的setter方法

在setter方法中添加校验

在setter方法中添加校验(续)

字段仍可以设置为无效值

将Date类型移到另外的包中

将Date类型移到另外的包中(续)

将Date字段设为未导出状态

通过导出的方法访问未导出的字段

通过导出的方法访问未导出的字段(续)

getter方法

封装

在Event类型中嵌入Date类型

未导出的字段不会被提升

导出的方法像字段一样被提升

导出的方法像字段一样被提升(续)

封装Event的Title字段

提升的方法与外部类型的方法共存

我们的calendar包完成了

你的Go工具箱

11 你能做什么:接口

具有相同方法的两种不同类型

只能接受一种类型的方法参数

只能接受一种类型的方法参数(续)

接口

定义满足接口的类型

定义满足接口的类型(续)

具体类型和接口类型

分配满足接口的任何类型

你只能调用接口中定义的方法

使用接口修复playList函数

类型断言

类型断言(续)

类型断言失败

当类型断言失败时避免异常

使用类型断言测试TapePlayer和TapeRecorder

“error”接口

“error接口”(续)

Stringer接口

Stringer接口(续)

空接口

空接口(续)

空接口(续)

你的Go工具箱

12 重新站起来:从失败中恢复

从文件中读取数字,重新访问

从文件中读取数字,重新访问(续)

任何错误都将阻止关闭文件

延迟函数调用

使用延迟函数调用从错误中恢复

使用延迟函数调用确保文件关闭

代码贴(续)

列出目录中的文件

列出子目录中的文件(会更棘手)

递归函数调用

递归函数调用(续)

递归地列出目录内容

递归地列出目录内容(续)

递归函数中的错误处理

发起一个panic

堆栈跟踪

延迟调用在崩溃前完成

通过scanDirectory使用“panic”

何时产生panic

“recover”函数

“recover”函数(续)

panic值从recover中返回

panic值从recover中返回(续)

从scanDirectory中的panic恢复

恢复panic

你的Go工具箱

13 分享工作:goroutine和channel

检索网页

检索网页(续)

多任务

使用goroutine的并发性

使用goroutine

使用goroutine(续)

使用goroutine(续)

在responseSize函数中使用goroutine

在responseSize函数中使用goroutine(续)

我们不能直接控制goroutine何时运行

go语句不能使用返回值

Go语句不能使用返回值(续)

使用channel发送和接收值

同步goroutine与channel

观察goroutine同步

使用channel修复我们的网页大小程序

使用channel修复我们的网页大小程序(续)

更新我们的channel以携带一个struct

你的Go工具箱

14 代码的质量保证:自动化测试

自动化测试比别人先发现bug

一个应该有自动化测试的函数

一个应该有自动化测试的函数(续)

我们引入了一个bug

编写测试

使用“go test”命令运行测试

测试实际的返回值

测试实际的返回值(续)

使用“Errorf”方法获得更详细的测试失败消息

测试“helper”函数

让测试通过

让测试通过(续)

测试驱动开发

另一个需要修复的bug

另一个需要修复的bug(续)

运行特定的测试集

表驱动测试

表驱动测试(续)

使用测试修复panic代码

使用测试修复panic代码(续)

你的Go工具箱

15 响应请求:Web应用程序

用Go编写Web应用程序

浏览器、请求、服务器和响应

一个简单的Web应用程序

你的计算机在自言自语

讲解一个简单的Web应用程序

讲解一个简单的Web应用程序(续)

资源路径

对不同的资源路径做出不同的响应

一级函数

将函数传递给其他函数

函数作为类型

函数作为类型(续)

函数作为类型(续)

接下来是什么

你的Go工具箱

16 要遵循的模式:HTML模板

留言簿应用程序

处理请求和检查错误的函数

设置一个项目目录并尝试应用程序

用HTML创建签名列表

使我们的应用程序以HTML响应

“text/template”包

使用带有模板的Execute方法的io.Writer接口

满足io.Writer的ResponseWriter和os.Stdout

使用action将数据插入模板

使用action将数据插入模板(续)

使用“if”action使模板的某些部分可选

使用“range”action来重复模板的某部分

使用action将struct字段插入模板

从文件中读入签名切片

从文件中读入签名切片(续)

保存签名和签名数的struct

更新模板以包含签名

允许用户使用HTML表单添加数据

表单提交请求

用于表单提交的Path和HTTP方法

从请求中获取表单字段的值

从请求中获取表单字段的值(续)

保存表单数据

保存表单数据(续)

HTTP重定向

我们完整的应用程序代码

你的Go工具箱

A 理解os.OpenFile:打开文件

理解os.OpenFile

将标志常量传递到os.OpenFile

将标志常量传递到os.OpenFile(续)

二进制表示法

位运算符

按位与运算符

按位或运算符

对“os”包常量使用按位或运算

使用按位或运算修复os.OpenFile选项

Unix样式的文件权限

使用os.FileMode类型表示权限

八进制表示法

将八进制值转换为FileMode值

解释对os.OpenFile的调用

B 有六件事我们没有涉及:剩下的内容

#1 “if”的初始化语句

#1“if”的初始化语句(续)

#2 switch语句

#3 更多基本类型

#4 更多关于符文的信息

#4更多关于符文的信息(续)

#4更多关于符文的信息(续)

#4更多关于符文的信息(续)

#5 有缓冲的channel

#5有缓冲的channel(续)

#5有缓冲的channel(续)

#6 进一步阅读

索引

读书笔记

本书评论