go 中的文章

理解Go程序进程的内存空间布局

Linux进程内存分布简介 在Linux系统中,一个程序进程在内存布局上遵循一定规律,进程的内存空间布局由高地址到低地址大致可分为以下几段: 栈(stack): 用户态的栈,栈的大小是固定的,其大小可以使用ulimit -s查看和调整,一般默认为8……

阅读全文

使用Delve的调试和反汇编功能阅读Go源码

Delve是一个专门用于Go语言的调试器,之前整理过Delve的基本使用,使用Delve调试Go程序。 本文进一步介绍如何使用Delve阅读Go的源码并找到一些语法在Go的内部是如何实现的。这里将一下在Go里创建channel的语法为例mak……

阅读全文

使用Delve调试Go程序

Delve是一个使用Go语言开发的专门用于Go语言的调试工具。Delve项目的地址是https://github.com/go-delve/delve, 这个项目的目标是为Go提供一个简单的、功能齐全、易于调用和使用的调试器。当前Go语言支持……

阅读全文

Go 1.15新特性学习笔记

Go 1.15继1.14 6个月后发布,主要是在工具链、运行时和类库上的改进,改版本继续保持对Go 1.x版本的兼容性。 Go 1.15值得关注的变化 Go 1.15中一些值得关注的地方: 对Go链接器的实质性改进 改进了对高核心计数的小对象的分配 X.509 CommonN……

阅读全文

理解Go语言struct的内存对齐

1.为什么要内存对齐? 先来看一下字长的概念。字长是CPU的主要技术指标之一,指的是CPU一次能并行处理的二进制位数,通常CPU的字长为4字节(32位)、8字节(64位)。 CPU在访问内存时,并不是逐个字节访问的,而是以字长为单位访问。这么做……

阅读全文

理解Go Modules

Go Modules是Go 1.11引入的,为了解决Go项目的依赖问题。从go 1.16开始,go modules开始成为Go默认的包依赖管理工具。 go moudle是一组go package的集合 一个Go Module实际上是由一组Go的Package的集……

阅读全文

Goroutine调度器学习笔记

三种多线程模型 操作系统的线程由内核的线程调度器负责调度,不同的编程语言对内核线程的封装不同,有以下三个模型: N:1模型: N个用户空间线程运行在1个内核空间线程上。优点是上下文切换快,缺点是无法有效利用多核特性。 在该模型下,线程管理由用户空间……

阅读全文

Go语言使用常量和iota模拟枚举类型

模拟枚举类型 go语言中虽然没有Java, C++等一些高级语言提供的枚举类型特性,但可以使用常量和iota来模拟。 例如: 1// BuildResult 构建结果 2type BuildResult int 3 4const ( 5 // Success 成功 6 Success BuildResult = iota 7 // Fail 失败 8 Fail 9 // Abort 中断 10 Abort 11) 1var buildResult = Success 2println(buildResult) // 0 使用go generate和stri……

阅读全文

理解Go interface的两种底层实现:iface和eface

Go语言interface的运行时实现的源码位于$GOROOT/src/runtime/runtime2.go中。 在Go的不同版本中,interface的实现可能会有不同,但整体结构变化不大,本文基于Go 1.17。 1.两类接口的运行时实现 可……

阅读全文