Golang源码阅读

总览

  1. src/cmd/dist/buf.c 该文件提供两个数据结构:Buf、Vec,分别用来取代char*char**的相关操作。Buf和Vec这两个数据结构非常简单易懂,其他C语言项目如有需要,可以比较方便的拿过去使用,因此记录在此。
  2. src/lib9/cleanname.c Unix下的路径压缩功能
  3. cmd/dist/windows.c windows平台相关的一些功能函数
  4. src/unicode/utf8/utf8.go utf8编码问题
  5. src/io/pipe.go 进程内的单工管道
  6. src/net/pipe.go 进程内的双工管道

1. src/cmd/dist/buf.c

Buf定义

// A Buf is a byte buffer, like Go's []byte.
typedef struct Buf Buf;
struct Buf
{
	char *p;
	int len;
	int cap;
};

对Buf结构相关的一些操作

Vec定义

// A Vec is a string vector, like Go's []string.
typedef struct Vec Vec;
struct Vec
{
	char **p;
	int len;
	int cap;
};

对Vec结构相关的一些操作

2. src/lib9/cleanname.c

char* cleanname(char *name) 该函数在原地(in place)实现了Unix下的路径压缩功能,能够处理多个 / . ..等等组合路径问题。

3. cmd/dist/windows.c

4. src/unicode/utf8/utf8.go

5. src/io/pipe.go 进程内的单工管道

该管道是单工的,一端只能写,另一端只能读。这里提供了两个接口PipeReaderPipeWriter,其底层使用的pipe结构体定义如下:

// A pipe is the shared pipe structure underlying PipeReader and PipeWriter.
type pipe struct {
	rl    sync.Mutex // 读锁,每次只允许一个消费者(reader)
	wl    sync.Mutex // 写锁,每次只允许一个生产者(writer)
	l     sync.Mutex // 整体锁,保护下面所有的成员变量
	data  []byte     // data remaining in pending write
	rwait sync.Cond  // waiting reader
	wwait sync.Cond  // waiting writer
	rerr  error      // if reader closed, error to give writes
	werr  error      // if writer closed, error to give reads
}

实现时,使用一个公共的字节缓冲区,通过读锁、写锁和整体锁这三把锁对这个缓冲区做好保护,实现在进程内的不同goroutine直接传递数据。

6. src/net/pipe.go 进程内的双工管道

使用 io.PipeReaderio.PipeWriter组合实现的双工管道,并且实现了net.Conn接口,其底层使用的pipe结构体定义如下:

type pipe struct {
	*io.PipeReader
	*io.PipeWriter
}