Alan Hou的个人博客

Google资深工程师深度讲解Go语言

Go语言的一些知识总结:

指针:一般不应在函数中传入指针来修改值,Unmarshal 这类除外。但在结构体较大时,向函数传入指针的性能会比较好,传递指针大约1纳秒,而10M大小的数据需要耗时1毫秒。返回值则不同,1M 以下的数据结构比指针类型要快,如100字节数据花费10纳秒,而这一数据结构的指针耗时在10纳秒(i7-8700 32GB内存测试数据)。

 小技巧

1、交叉编译

2、查询出所有的库函数、结构体等,如 net/http

3、使用Docker容器编译

出现/lib/ld-musl-x86_64.so.1: bad ELF interpreter: No such file or directory报错可在编译时使用-e CGO_ENABLED=0,或依然在 alpine 内执行

4、Golang操作 Docker API

API文档地址:https://docs.docker.com/engine/api/v1.41/

5、相关资源

6、单元测试覆盖率

7、利用工具检测变量遮蔽问题(不能定位所有问题)

8、查看闭包的引用传递

 

Go 一些工具和功能

Go语言的安装与开发环境
基础语法
内建容器
面向“对象”
面向接口
函数式编程
错误处理和资源管理
测试与性能调优
Goroutine
Channel
http及其他标准库
迷宫的广度优先搜索
开始实战项目
单任务版爬虫
并发版爬虫
数据存储和展示
分布式爬虫
课程总结

Go语言的安装与开发环境

下载:

国内:http://studygolang.com/dl

https://golang.org/dl/

开发环境:vi, emacs, idea, eclipse, vs, sublime … + go 插件

IDE:Goland, liteIDE

本课程使用 idea + go 插件

多版本:https://golang.org/doc/manage-install

本文GitHub仓库:https://github.com/alanhou/learning-go

VS Code:使用快捷键:command+shift+P,然后键入:go:install/update tools,将所有 16 个插件都勾选上,然后点击 OK 即开始安装

学习资料:

基础语法

变量

变量定义

内建变量类型

复数回顾

最美公式 – 欧拉公式

$$e^{i\pi} + 1 = 0$$

强制类型转换

常量与枚举

常量的定义

使用常量定义枚举类型

注:iota 是希腊字母中第9个字母:Ι, ι,英文释义为极小值

变量定义要点回顾

条件语句

if

switch

循环

for

基本语法要点回顾

函数

函数语法要点回顾

指针

参数传递

值传递?引用传递?

内建容器

数组、切片和容器

数组

为什么要用 range?

数组是值类型

切片(Slice)

Reslice

Slice 的扩展

Slice 的实现

向 Slice 添加元素

Map

map 的操作

map 的遍历

map 的 key

map例题

寻找最长不含有重复字符的子串

解题思路:

对于一个字母 x

解决中文等国际化字符的问题:

rune相当于 go 语言的 char

其它字符串操作

strings 包下有更多可进行查看

面向“对象”

结构体和方法

面向对象

结构的创建

结构创建在堆上还是栈上?

为结构定义方法

使用指针作为方法接收者

值接收者 vs 指针接收者

包和封装

封装

go 语言中如何扩充系统类型或者别人的类型

GOPATH以及目录结构

GOPATH 环境变量

以 Mac 为例(~/.bash_profile)

go get 获取第三方库

GOPATH下目录结构

面向接口

duck typing的概念

大黄鸭是鸭子吗?

Python 中的 duck typing

C++中的 duck typing

Java 中的类似代码

Go 语言的 duck typing

接口的定义和实现

接口的定义

使用者(download)→实现者(retriever)

接口的实现

接口的值类型

接口变量里面有什么

接口变量

接口变量里面有什么

查看接口变量

接口的组合

常用系统接口

函数式编程

函数与闭包

函数式编程 vs. 函数指针

“正统”函数式编程

闭包

Python 中闭包

C++中的闭包

Java 中的闭包

Go语言闭包的应用

总结

错误处理和资源管理

defer调用

何时使用 defer 调用

错误处理概念

错误处理

服务器统一出错处理

panic和recover

panic

recover

服务器统一出错处理2

error vs panic

错误处理综合示例

测试与性能调优

测试

Debugging Sucks! Testing Rocks!

传统测试 vs 表格驱动测试

传统测试

表格驱动测试

代码覆盖率和性能测试

代码覆盖率

性能测试(Benchmark)

使用pprof进行性能调优


http 测试

  • 通过使用假的 Request/Response(TestErrWrapper)
  • 通过起服务器(TestErrWrapperInServer)

生成文档和示例代码

文档

  • 用注释写文档
  • 在测试中加入 Example
  • 使用 go doc/godoc 来查看/生成文档

Goroutine

协程 Coroutine

Subroutines are special cases of more general program components, called coroutines.

子进程是协程的一个特例

普通函数:线程  main ➝ doWork

协程:线程(可能) main ⟺ doWork

其它语言中的协程

goroutine 的定义

go routine 可能的切换点

Channel

例一:使用 Channel 来等待 goroutine 结束

例二:使用 Channel 来实现树的遍历

例三:使用 Select 来进行调度

传统同步机制

http及其他标准库

http

http 服务器的性能分析

其它标准库

文档

第三方 http 框架

迷宫的广度优先搜索

广度优先算法

例:广度优先搜索走迷宫

开始实战项目

爬虫项目介绍

为什么做爬虫项目

网络爬虫分类

go语言的爬虫库/框架

本课程爬虫项目

爬虫的主题

爬取内容

爬取人

总体算法

单任务版爬虫

 

并发版爬虫

数据存储和展示

分布式爬虫

课程总结

更新中…

其它示例代码:https://github.com/e421083458/gateway_demo

常用命令汇总

其它

下载安装

https://golang.org/dl/
https://golangtc.com/download

http://gorm.book.jasperxu.com/

http://www.topgoer.com/

常见问题

1、dyld: malformed mach-o image: segment __DWARF has vmsize < filesize

这是 macOS 升级到 Catalina 之后出现的问题,使用go build -ldflags “-w”来代替 go build:

 

退出移动版