http://www.cs.columbia.edu/~aho/cs6998/reports/12-12-11_DeshpandeSponslerWeiss_GO.pdf Runtime管理任务调度,垃圾收集及运行环境。大家知道Go语言程序是编译为机器代码来执行的。同时,Go提供了一些高级的功能,如goroutine, channel, 以及Garbage collection。这些高级功能需要一个runtime的支持。1.4之前,runtime还是由C语言所编写的,(按照Go dev team的规划,1.5版本将去除C的代码,runtime将完全由Go语言来完成。)不论何种方式,runtime和用户编译后的代码被linker静态链接起来,形成一个可执行文件。这个文件从操作系统角度来说是一个user space的独立的可执行文件。 从运行的角度来说,这个文件由2部分组成,一部分是用户的代码,另一部分就是runtime。runtime通过接口函数调用来管理goroutine, channel及其他一些高级的功能。从用户代码发起的调用操作系统API的调用都会被runtime拦截并处理。
https://www.openapis.org/ https://github.com/OAI/OpenAPI-Specification/issues https://www.jsonrpc.org/specification https://www.grpc.io/docs/guides/concepts/
https://github.com/gin-gonic/gin https://github.com/julienschmidt/httprouter https://github.com/julienschmidt/go-http-routing-benchmark
对于长整型数据的映射。怎样解决Hash冲突和Hash表大小的设计是一个非常头疼的问题。 radix树就是针对这样的稀疏的长整型数据查找,能高速且节省空间地完毕映射。借助于Radix树,我们能够实现对于长整型数据类型的路由。 利用radix树能够依据一个长整型(比方一个长ID)高速查找到其相应的对象指针。这比用hash映射来的简单,也更节省空间,使用hash映射hash函数难以设计,不恰当的hash函数可能增大冲突,或浪费空间。
golang的web框架echo和gin都使用了radix tree作为路由查找的算法 https://github.com/labstack/echo https://github.com/gin-gonic/gin 在gin的路由中,每一个Http Method(GET, PUT, POST…)都对应了一棵 radix tree