JOE'S BLOG

好记性不如烂键盘

0%

测试

多做测试 少做调试

传统测试 vs 表格驱动测试

传统测试

  • 测试数据和测试逻辑混在一起
  • 出错信息不明确
  • 一旦一个数据出错测试全部结束

表格驱动测试

  • 分离测试数据和测试逻辑
  • 明确的出错信息
  • 可以部分失败

go语言 测试文件跟与要测试的文件同目录,文件名规则如下

1
add_test.go

命令行运行测试用例

1
go test .   

测试用例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main

import "testing"

func TestAdd(t *testing.T) {
tests := []struct {a, b, c int}{
{1,2,3},
{2,3,5},
{4,6,10},
{3,4,0},
{19,1,20},
}

for _, tt := range tests {
if actual := add(tt.a, tt.b); actual != tt.c {
t.Errorf("add(%d,%d); "+"got %d; expected %d",tt.a,tt.b,actual,tt.c)
}
}
}
Read more »

go语言并发编程

goroutine

轻量级 线程
非抢占式多任务处理,由协程主动交出控制权
编译器/解释器/虚拟机层面的多任务

使用go关键字

1
2
//检测数据冲突
go run -race main.go

channel
goroutine之间通信
不要通过共享内存来通信;通过通信来共享内存

chan<- int 表示只发送不能接收
<-chan int 表示只接收不能发送

所有的并发问题 都可以用一致的、简单的既定的模式来规避。所有可能的话,将变量限定在goroutine内部,如果是多个goroutine都需要访问的变量,使用互斥条件来访问

go的调度器,当一个goroutine调用了time.Sleep等 阻塞时,调度器会使其进入休眠并开始执行另一个goroutine直到时机到了再去唤醒第一个goroutine。这种调度不需要进入内核的上下文,所以比线程的代价低

Read more »

安装&使用

安装

下载源码包到你想放置的目录,然后设置环境变量

1
2
3
4
export GOROOT=$HOME/go
export PATH=$PATH:$GOROOT/bin
export GOPATH=/data/work
export PATH=$PATH:$GOPATH/bin

使用

有2种方式运行程序

解释性语言的常用运行方式

1
go run main.go

先编译成二进制,然后运行

1
go build -o main main.go & ./main

跨平台编译, 编译完后把二进制包以及必要的资源文件copy到需要使用的机器上,无需安装环境即可使用

1
2
3
GOOS=darwin GOARCH=amd64 go build -o main main.go  
GOOS=windows GOARCH=amd64 go build -o main main.go
GOOS=linux GOARCH=amd64 go build -o main main.go
Read more »

HGOJ安装和使用说明

湖南工学院在线判题系统,使用Golang进行了重构,现在正式开放出来给湖工ACM竞赛队的同学使用。

Read more »

分清以下几个概念

  1. 指针数组 数组指针
  2. 指针函数 函数指针
  3. 指针常量 常量指针
  4. typedef
  5. #define
  6. 可变参数
  7. 字符串常量

内容主要来自《C专家编程》《C陷阱和缺陷》《C和指针》

Read more »

zval

PHP在内核中是通过zval这个结构体来存储变量的,PHP的变量是弱类型的,首先来看看PHP5的zval设计

PHP5的zval

1
2
3
4
5
6
7
8
9
10
/*
考虑到结构体对齐 大小为24字节
*/
struct _zval_struct{
/*变量信息*/
zvalue_value value; // 16字节
zend_uint refcount__gc; // 4字节
zend_uchar type; /* 类型 1字节*/
zend_uchar is_ref__gc; // 1字节
};
Read more »

从PHP的执行原理开始

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的缓存

Read more »

最近学习了个小项目, 打算把它作为我们队的论坛系统,但部署到服务器上时发现 打开一个页面要等好久。在此记录下如何解决的,最后的处理结果也是非常简单。

Read more »

引言

UNIX系统提供的经典进程间通信机制(IPC): 管道、FIFO、消息队列、信号量以及共享存储。这些机制允许在同一台计算机上运行的进程可以相互通信。本章内容主要是研究在不同计算机上的进程相互通信的机制: 网络进程间通信(network IPC)。

Read more »