SF
千方阁
千方阁
注册登录
关注博客
注册登录
主页
关于
RSS
编译原理 一 绪论
CanThink
2019-04-11
阅读 1 分钟
1.6k
程序设计语言和编译程序 用助记符 代替机器语言(二进制编码)的另一种语言,汇编语言。 汇编语言编写的程序必须翻译成机器语言才能执行,这种翻译是通过“汇编程序”实现的。 编译程序就是指这样一种程序,通过它能够将用高级语言编写的源程序转换为与之在逻辑上等价的低级语言形式的目标程序。 一个高级语言程序的执行分...
Go 值传递与引用传递
CanThink
2019-03-18
阅读 3 分钟
10.6k
问题引入 什么时候选择 T 作为参数类型,什么时候选择 *T 作为参数类型? [ ] T 是传递的指针还是值?选择 [ ] T 还是 [ ] *T ? 哪些类型复制和传递的时候会创建副本? 什么情况下会发生副本创建? T 和 *T 当做函数参数时都是传递它的副本 先看传 T 的情况: {代码...} 执行 exp2 方法,输出结果为:结果说明: _u 是 u...
Go Chanel 使用与原理 三
CanThink
2019-03-17
阅读 6 分钟
2.4k
上篇已经记录到发送数据到 chanel 的三种情况的代码逻辑,接下来是从 chanel 接收数据的逻辑。 chanrecv 方法 和 chansend 方法十分类似 如果 hchan 为空 {代码...} 如果 chenel 已经关闭 {代码...} 接收数据的三种情况 如果 hchan 的 sendq 队列中有阻塞的 goroutine,buf 已满 如果 hchan.buf 还有数据未取出 如果 hch...
Go Chanel 使用与原理 二
CanThink
2019-03-16
阅读 8 分钟
3.1k
c.buf = add(unsafe.Pointer(c), hchanSize) 分配 hchanSize 大小的空间,其中常量 hchanSize hchanSize = unsafe.Sizeof(hchan{}) + uintptr(-int(unsafe.Sizeof(hchan{}))&(maxAlign-1))
进程与线程
CanThink
2019-03-15
阅读 3 分钟
2k
进程的定义 一个进程实体包括三部分:程序段,数据段,pcb,这个进程实体就简称为进程 进程的特征 动态性 进程由创建而产生,由调度而执行,由撤销而消亡 有一定生命期 进程的实质是进程实体的执行过程 并发性 指多个进程实体能够同时存在内存中,且能够在一段时间内同时运行。这也正是引入进程概念的目的 异步性 每个进...
Go Chanel 使用与原理 一
CanThink
2019-03-15
阅读 4 分钟
4.3k
访问已经关闭的 chanel {代码...} 控制台结果如图:往已经关闭的 chanel 写入数据 {代码...} 控制台结果如图:关闭已经关闭的 chanel {代码...} chanel 底层实现chanel 的数据结构1个基于数组的循环队列,有缓冲的channel用它暂存数据2个基于双向链表的队列,用于保存阻塞在此channel上的发送方或接收方goroutinechanel ...
Beego Logs 源码分析 中篇
CanThink
2019-03-14
阅读 8 分钟
3.2k
文件输出引擎使用到的读写锁 sync.RWMutex 读写锁是一种同步机制,允许多个读操作同时读取数据,但是只允许一个写操作写数据。锁的状态有三种:读模式加锁、写模式加锁、无锁。 无锁。读/写进程都可以进入。 读模式锁。读进程可以进入。写进程不可以进入。 写模式锁。读/写进程都不可以进入。 就拿文件行数这个变量来看...
Beego Logs 源码分析 上篇
CanThink
2019-03-12
阅读 7 分钟
3.8k
Beego Logs 使用 先大致了解怎么使用,再进行剖析。 {代码...} {代码...} 上面有一句代码: {代码...} 往 channelLens 切片添加一个值为零的元素后再取头个元素,这个技巧有以下好处: Go 不支持可选参数,但 Go 支持可变参数,这样做变相达到了可选参数的效果。 如果 chanelLens 原来为空的话也能拿出一个值为零的元素...