php array 发表于 2019-07-13 | | 阅读次数: 数组PHP数组的低层实现为散列表(HashTable,也称作:哈希表)。除了我们熟悉的PHP用户空间的Array类型之外,内核中也随处用到了散列表,比如函数,类,常量,已include文件的索引表,全局符号表等都用HashTable存储。 散列表是根据关键码值(Key value)而直接进行访问的数 ... 阅读全文 »
php7新特性 发表于 2019-07-10 | | 阅读次数: PHP7新特性太空船操作符 <=> 太空船操作符用于比较两个表达式 例如,当$a小于、等于或大于$b时,它分别返回-1、0或1 123echo 1<=>1; //0echo 1<=>2; //-1echo 2<=>1; //1 类型声明 declar ... 阅读全文 »
go mutex 发表于 2019-07-07 | | 阅读次数: 1. 前言互斥锁是并发程序中对共享资源进行访问控制的主要手段,对此Go语言提供了非常简单易用的Mutex,Mutex为一结构体类型,对外暴露两个方法Lock()和Unlock()分别用于加锁和解锁。 Mutex使用起来非常方便,但其内部实现却复杂得多,这包括Mutex的几种状态。另外,我们也想探究一 ... 阅读全文 »
go range 发表于 2019-07-06 | | 阅读次数: 1.前言range是Golang提供的一种迭代遍历手段,可操作的类型有数组、切片、Map和channel等,实际使用频率非常高。 探索range的实现机制是很有意思的事情,这可能会改变你使用range的习惯。 2.热身2.1 题目一:切片遍历下面函数通过遍历切片,打印切片的下标和元素值,请问性能上有 ... 阅读全文 »
go select 发表于 2019-07-06 | | 阅读次数: 1. 前言select是Golang在语言层面提供的多路IO复用的机制,其可以检测多个channel是否ready(即是否可读或可写),使用起来非常方便。 本章试图根据源码总结其实现原理,从而发现一些使用误区或解释一些不太常见的现象。 2. 热身环节2.1 题目1下面的程序输出是什么? 123456 ... 阅读全文 »
go defer 发表于 2019-07-06 | | 阅读次数: 1.前言defer语句用于延迟函数的调用,每次defer都会把一个函数压入栈中,函数返回前,再把延迟函数取出并执行。 为了方便描述,我们把创建defer的函数称为主函数,defer语句后面的函数称为延迟函数。 延迟函数可能有输入参数,这些参数可能来源于定义defer的函数,延迟函数也可能引用主函数用 ... 阅读全文 »
go iota 发表于 2019-07-06 | | 阅读次数: 1.前言我们知道iota常用于const表达式中,我们还知道其值是从零开始的,const声明块中每增加一行iota值自增1。 使用iota可以简化常量定义,但其规则必须要牢牢掌握,否则在我们阅读别人源码时可能会造成误解或障碍。本节我们尝试全面的总结其使用场景,另外花一小部分时间看一下其实现原理,从原 ... 阅读全文 »
go channel 低层源码剖析 发表于 2019-07-06 | | 阅读次数: 1. 前言channel是Golang在语言层面提供的goroutine间通信方式,比Unix管道更易用也更轻便。channel主要用于进程内各goroutine间通信,如果需要跨进程通信,建议使用分布式系统方法来解决。 本章,从源码角度分析channel的实现机制,实际上这部分源码非常简单易读。 ... 阅读全文 »
go map原理剖析 发表于 2019-07-01 | | 阅读次数: 1. map数据结构golang的map的使用了哈希表作为低层实现,一个哈希表里可以有多个哈希表节点,也即bucket,而每个bucket保存了map中的一个或一组键值对。 map的数据结构由runtime/map.go:hmap定义: 12345678type hmap struct { ... 阅读全文 »
Go string低层原理 发表于 2019-06-30 | | 阅读次数: string标准概念Go标准库builtin给出了所有内置类型的定义。源码位于src/builtin/builtin.go,其中关于string的描述如下: 1234// string is the set of all strings of 8-bit bytes, conventionally ... 阅读全文 »