Thinking In Go Language

0x00 前言

本来这篇文章是写 Rust 的,结果刚开了一个开头就弃坑了。

为什么是 Go

写着玩玩的….

工具链

文档

社区

书籍

0x01 基本概念

内置简单类型

对于一些基本的数据类型,操作为 加减乘除取余数位运算等等

  • 数字类型
  • 布尔类型
  • 字符串类型
  • 数组 / 列表
  • 字典

内置复杂类型

  • 集合结构 : 串
  • 线性结构 : 线性表 (单链表,静态链表,循环链表,双向链表,栈,队列)
  • 树形结构 : 树(二叉树,B+ 树,红黑树)
  • 图形结构 : 图

对象

字符串

0x02 中级概念

函数

作用域

模块

模块,这个概念,可大可小,大的时候,把一个程序说成是模块,小的时候,可以把一个文件,甚至你说这一个函数是一个模块,也行。

这里的模块指的是一个包下的函数。

面向对象

面向对象有三大概念:

  • 封装
  • 继承
  • 多态

错误 / 调试测试

异常处理实际上可以考验一个程序员编写代码的健壮性。

事实上来说,代码写的健壮是一个程序员必备的素养。但其实在开发过程中,出于对项目进行赶工上线,需要对程序的健壮性做出一定的取舍。并且,在编写客户端,服务端,网页前端的时候基本上都会遇到这个问题。什么时候选择健壮的程序,什么时候选择是还可以的程序。需要自己的经验。

IO 编程

进程和线程

多线程

Go 多线程约等于并发。

多进程

协同式多任务处理

如果有两个线程,同时进行 IO 请求,当其中一个线程连接之后,立即会主动让出 GIL, 其他线程就可以运行。

当 N 个线程在网络 I/O 堵塞,或等待重新获取 GIL,而一个线程运行 Python。

让出之后还要执行代码呀,所以要有个收回 GIL 的动作。

抢占式多任务处理
线程安全

原子操作:sort 之类不需要
非原子操作:n=n+2 的字节码分为 加载 n , 加载 2 , 相加,存储 n, 四个步骤,由于不是原子性,很可能被由于 15 ms 而被打断。

当然,懒人一向是 : 优先级不决加括号,线程不决加 lock

对于 Java, 程序员努力在尽可能短的时间内加锁存取共享数据,减轻线程的争夺,实现最大并行。但 Python 中,线程无法并行运行,细粒度的锁就没有了优势。

正则表达式

0x03 高级技巧

0x04 标准库

常用内建模块

系统化模块

0x05 第三方库

  • Requests : API 人性化

0x06 代码质量

正确性

可维护性

可读性

安全性

性能

0x07 常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
go build
go install -v
go clean
go fmt
go get
go test
go tool fix . # 修复老代码到新版本
go tool vet directory|files
go tool yacc -o gopher.go -p parser gopher.y
godoc -http=:8080
go version 查看 go 当前的版本
go env 查看当前 go 的环境变量
go list 列出当前全部安装的 package
go run 编译并运行 Go 程序

0xEE 文章更新


ChangeLog:

  • 2018-08-22 初始化接口