测试
多做测试 少做调试
传统测试 vs 表格驱动测试
传统测试
- 测试数据和测试逻辑混在一起
- 出错信息不明确
- 一旦一个数据出错测试全部结束
表格驱动测试
- 分离测试数据和测试逻辑
- 明确的出错信息
- 可以部分失败
go语言 测试文件跟与要测试的文件同目录,文件名规则如下
1 | add_test.go |
命令行运行测试用例
1 | go test . |
测试用例代码
1 | package main |
多做测试 少做调试
传统测试 vs 表格驱动测试
go语言 测试文件跟与要测试的文件同目录,文件名规则如下
1 | add_test.go |
命令行运行测试用例
1 | go test . |
测试用例代码
1 | package main |
goroutine
轻量级 线程
非抢占式多任务处理,由协程主动交出控制权
编译器/解释器/虚拟机层面的多任务
使用go关键字
1 | //检测数据冲突 |
channel
goroutine之间通信
不要通过共享内存来通信;通过通信来共享内存
chan<- int 表示只发送不能接收
<-chan int 表示只接收不能发送
所有的并发问题 都可以用一致的、简单的既定的模式来规避。所有可能的话,将变量限定在goroutine内部,如果是多个goroutine都需要访问的变量,使用互斥条件来访问
go的调度器,当一个goroutine调用了time.Sleep等 阻塞时,调度器会使其进入休眠并开始执行另一个goroutine直到时机到了再去唤醒第一个goroutine。这种调度不需要进入内核的上下文,所以比线程的代价低
下载源码包到你想放置的目录,然后设置环境变量
1 | export GOROOT=$HOME/go |
有2种方式运行程序
解释性语言的常用运行方式
1 | go run main.go |
先编译成二进制,然后运行
1 | go build -o main main.go & ./main |
跨平台编译, 编译完后把二进制包以及必要的资源文件copy到需要使用的机器上,无需安装环境即可使用
1 | GOOS=darwin GOARCH=amd64 go build -o main main.go |
PHP是一门解释型语言,执行过程如下:
第一步:源码通过词法分析得到Token。Token是PHP代码被切割成的有意义的标识。在zend_language_parse.h文件中做了定义,比如echo对应的Token是T_ECHO,值为328
第二步:语法分析将Token和符合文法规则的代码生成抽象语法树。在PHP7中,AST是新特征
第三步:将AST生成对应的opcode,并被虚拟机执行。opcode是PHP定义的一组指令标识,对应相应的handler。opcodes是opcode的集合形式,是PHP执行过程的中间代码,类似Java的字节码。PHP优化中有一个常见的“开启opcache”,指的就是opcodes的缓存
最近学习了个小项目, 打算把它作为我们队的论坛系统,但部署到服务器上时发现 打开一个页面要等好久。在此记录下如何解决的,最后的处理结果也是非常简单。