单测是提高代码质量的重要一环,在提交代码尤其是开源社区单测一般是必需要随代码一起提交的,下面我们来看一下Golang中是如何写单元测试的。 Go中提供了专门用来写单元测试的包 testing, 运行时只需要 go test 即可。 单元测试主要分为以下三类: 功能测试(Test) 性能测试(Benchmark) 示例测试(Example) 测试文件名称一般是源代码文件加上 "_test.go", 比如 源代码文件为 add.go ,则测试文件名称为add_test.go。 在展开单元测试之前先讲下,testing包中的输出函数: t.Log() : 正常日志输出; t.Errorf(): 错误日志输出,当前函数继 …
阅读更多Go语言 最大的特点是提供简单易用的并发编程,这个并发的执行单元就是goroutine, 这个goroutine 是运行在用户态,并由GO自身来调度。调度器来决定谁来使用CPU资源,谁该让出CPU资源。 本文就来深入探讨一下Go的调度原理。 GMP调度模型 Go采用的是GMP调度模型。 核心概念 G :即Goroutine ,使用关键字 go 即可创建一个协程来处理用户程序,如下所示: 1 go func() //创建协程来执行函数 M :Machine 系统抽象的线程,代表真正的机器资源,目前最多10000,超过这个数量会panic. P :Process,虚拟处理器,代表goroutine的上下文,用于关联G和M;P的数量可以通 …
阅读更多知其然,也要知其所以然,从今天开始研究一下golang的底层实现,首先从其启动开始; 找到启动点 1. 写一个hello world. 1package main 2 3import ( 4 "fmt" 5) 6 7func main() { 8 fmt.Println("hello world") 9} 2.编译后使用gdb找到entry point 1$ gdb hello 2 ..... 3 file type mach-o-x86-64. 4 Entry point: 0x1052720 5 0x0000000001001000 - 0x0000000001093074 is .text 6 …
阅读更多程序组成 程序由代码和数据组成,数据又有静态与动态之分; 动态数据:存放在堆区和栈区; 静态数据:静态只读数据可以放在代码区,也可以放在特定的只读数据区; 可读写的已初始化的静态数据放在数据区,可读写的未初始化的静态数据放在bss区; 寄存器 伪寄存器 FP(Frame pointer): 表示参数以及返回值的基地址; 通过 SYMBOL+/-ffset(FP) PC(Program counter): 跳转寄存器,存储下一条指令地址; SB(Static base pointer): 全局静态起始地址. SP(Stack pointer): 表示本地变量的起始地址; 使用方式 symbol + offset(SP), 例如第一个变 …
阅读更多Go module 是golang最新的包管理工具,可以使依赖包版本信息更明确与可控。module 是关于Go packages的集合,存储在根目录下的go.mod文件中,go.mod 定义了模块的模块路径以及模块的依赖属性,依赖属性包含模块路径以及特定寓意的版本信息。 需要注意的是:在Go 1.13之前go module 在GOPATH下是默认不开启的,这是为了兼容的需要,如果需要使用go module可以在GOPATH/src外的路径创建go.mod文件。 本文会介绍Go module的一些基本用法; 常见命令 创建一个模块 添加一个依赖 升级依赖 其他命令 常见命令 go mod 提供了以下命令 download: 下载依赖包 …
阅读更多