
Golang
文章平均质量分 92
机器铃砍菜刀
欢迎关注微信公众号:Golang技术分享
展开
-
Go同步原语的基石
Go是一门以并发编程见长的语言,它提供了一系列的同步原语方便开发者使用,例如sync包下的Mutex、RWMutex、WaitGroup、Once、Cond,以及抽象层级更高的Channel。但是,它们的实现基石是原子操作。需要记住的是:软件原子操作离不开硬件指令的支持。本文拟通过探讨原子操作——**比较并交换(compare and swap, CAS)**的实现,来理解Go是如何借助硬件指令来实现这一过程的。什么是CAS在看源码实现之前,我们先理解一下CAS。维基百科定义:CAS是原子操作的一种,原创 2021-04-07 14:43:03 · 179 阅读 · 0 评论 -
详解Go内联优化
为了保证程序的执行高效与安全,现代编译器并不会将程序员的代码直接翻译成相应地机器码,它需要做一系列的检查与优化。Go编译器默认做了很多相关工作,例如未使用的引用包检查、未使用的声明变量检查、有效的括号检查、逃逸分析、内联优化、删除无用代码等。本文重点讨论内联优化相关内容。内联在《详解逃逸分析》一文中,我们分析了栈分配内存会比堆分配高效地多,那么,我们就会希望对象能尽可能被分配在栈上。在Go中,一个goroutine会有一个单独的栈,栈又会包含多个栈帧,栈帧是函数调用时在栈上为函数所分配的区域。但其实,函原创 2021-02-01 19:10:20 · 545 阅读 · 0 评论 -
详解Go逃逸分析
小菜刀最近在medium上阅读了一篇高赞文章《Go and CPU Caches》,其地址为https://teivah.medium.com/go-and-cpu-caches-af5d32cc5592,感觉收获颇多。小菜刀在该文章的基础上做了些修改和扩展,整理出来分享给读者朋友们。CPU缓存体系现代计算机处理器架构多数采用对称多处理系统(Symmetric multiprocessing system,SMS)。在这个系统中,每一个核心都当成是独立的处理器,多处理器被连接到同一个共享的主存上,并由单原创 2021-01-13 19:20:00 · 1726 阅读 · 1 评论 -
CPU缓存体系对Go程序的影响
小菜刀最近在medium上阅读了一篇高赞文章《Go and CPU Caches》,其地址为https://teivah.medium.com/go-and-cpu-caches-af5d32cc5592,感觉收获颇多。小菜刀在该文章的基础上做了些修改和扩展,整理出来分享给读者朋友们。CPU缓存体系现代计算机处理器架构多数采用对称多处理系统(Symmetric multiprocessing system,SMS)。在这个系统中,每一个核心都当成是独立的处理器,多处理器被连接到同一个共享的主存上,并由单原创 2021-01-12 19:09:23 · 505 阅读 · 1 评论 -
含有CGO代码的项目如何实现跨平台编译
目前小菜刀的项目中需要用到SQLite数据库,https://github.com/mattn/go-sqlite3支持database/sql接口,采用Go的标准接口有利于项目后续扩展,因此选择了该驱动。但是,它是基于CGO实现的,所以跨平台编译会比较麻烦,小菜刀总结了一些经验,特分享给读者朋友们。什么是跨平台编译?简单地说, 就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是,所谓平台,实际上包含两个概念:体系架构(Architecture)、操作系统 (Operating System原创 2021-01-11 20:56:31 · 899 阅读 · 1 评论 -
切片传递与指针传递到底有啥区别
提出疑问在Go的源码库或者其他开源项目中,会发现有些函数在需要用到切片入参时,它采用是指向切片类型的指针,而非切片类型。这里未免会产生疑问:切片底层不就是指针指向底层数组数据吗,为何不直接传递切片,两者有什么区别?例如,在源码log包中,Logger对象上绑定了formatHeader方法,它的入参对象buf,其类型是*[]byte,而非[]byte。func (l *Logger) formatHeader(buf *[]byte, t time.Time, file string, line in原创 2020-11-27 14:00:19 · 486 阅读 · 1 评论 -
一文读懂Channel设计
在Go中,要理解channel,首先需要认识goroutine。一、为什么会有goroutine现代操作系统中为我们提供了三种基本的构造并发程序的方法:多进程、I/O多路复用和多线程。其中最简单的构造方式当属多进程,但是多进程的并发程序,由于对进程控制和进程间通信开销巨大,这样的并发方式往往会很慢。因此,操作系统提供了更小粒度的运行单元:线程(确切叫法是内核线程)。它是一种运行在进程上下文中的逻辑流,线程之间通过操作系统来调度,其调度模型如下图所示。多线程的并发方式,相较于多进程而言要快得多。但是原创 2020-11-25 20:44:38 · 1805 阅读 · 0 评论 -
万字长文全面解析Go是如何设计Map的
由于本文篇幅较长,故将目录整理如下什么是Map维基百科的定义In computer science, an associative array, map, symbol table, or dictionary is an abstract data type composed of a collection of (key, value) pairs, such that each possible key appears at most once in the collection.说明:在计原创 2020-11-04 22:11:05 · 669 阅读 · 1 评论 -
Golang中[]byte与string转换全解析
string类型和[]byte类型是我们编程时最常使用到的数据结构。本文将探讨两者之间的转换方式,通过分析它们之间的内在联系来拨开迷雾。两种转换方式标准转换go中string与[]byte的互换,相信每一位gopher都能立刻想到以下的转换方式,我们将之称为标准转换。 // string to []byte s1 := "hello" b := []byte(s1) // []byte to string s2 := string(b)强转换通过unsafe和ref原创 2020-10-31 17:39:09 · 29714 阅读 · 8 评论 -
写给Go新手的入门指南
1. Go 语言官方教程教程网址:http://tour.go-zh.org该指南提供了运行平台和示例代码,循序渐进地带你走进Go语言的世界。非常方便初学者学习Go的基础知识。2.常用书籍在Go语言的10年里,有非常多优秀的书籍。这里推荐两本适合初学者的书:《Go程序设计语言》、《The Go Programming Language》又名《Go语言圣经》。作为新手入门,啃一本就足够了。3.基础视频习惯看视频学习的小伙伴们,推荐无闻的《Go 编程基础》系列视频...原创 2020-05-17 16:37:26 · 887 阅读 · 0 评论 -
Golang之Sort包
Go语言是一门非常简单优雅的语言,其源码更是其风格标杆。看源码,不仅能学习Go的设计哲学,了解如何调用库函数,同时帮助我们写出更优雅的go代码。Go源码位于GOROOT目录下的src中。本文学习1.14.1版本源码库的sort包。该包对外提供的主要功能是排序和搜索。其核心的函数分别是:sort.Sort()与sort.Search()。1. sort.Sort()函数定义如下func Sort(data Interface) { n := data.Len() quickSo原创 2020-05-20 21:38:12 · 937 阅读 · 0 评论 -
Go交叉编译
交叉编译是指在一个硬件平台生成另一个硬件平台的可执行文件。而Go提供了非常方便的交叉编译方式。如何编译Go交叉编译,涉及到几个环境变量的设置: GOARCH、GOOS和CGO_ENABLED。 GOARCH:编译目标平台的硬件体系架构(amd64, 386, arm, ppc64等)。 GOOS:编译目标平台上的操作系统(darwin, freebsd, linux, windows)。 CGO_ENABLED:代表是否开启CGO,1表示开启,0表示禁用。由于CGO不.原创 2020-05-17 14:52:11 · 7994 阅读 · 0 评论 -
【译】Golang中的调度(3):并发编程 - Concurrency
序为了更好理解Go调度器的内在机制,我会以三个部分的内容分别进行阐述,链接如下:Golang中的调度(1):OS调度器 - OS Scheduler Golang中的调度(2):Go调度器 - Go Scheduler Golang中的调度(3):并发编程- Concurrency本部分内容主要讨论并发编程。引言当我遇到问题,尤其是新问题时,我并不知道是否适合使用并发解决。首...原创 2020-01-10 08:51:38 · 348 阅读 · 0 评论 -
【译】Golang中的调度(2):Go调度器 - Go Scheduler
序为了更好理解Go调度器的内在机制,我会以三个部分的内容分别进行阐述,链接如下:Golang中的调度(1):OS调度器 - OS Scheduler Golang中的调度(2):Go调度器 - Go Scheduler Golang中的调度(3):并发- Concurrency本部分内容主要讨论Go调度器。引言在本系列文章的第一部分,我阐述了在OS调度器中各个方面的知识,这些...原创 2019-12-15 15:23:29 · 585 阅读 · 0 评论 -
【译】Golang中的调度(1):OS调度器 - OS Scheduler
序为了更好理解Go调度器的内在机制,我会以三个部分的内容分别进行阐述,链接如下:Golang中的调度(1):OS调度器 - OS Scheduler Golang中的调度(2):Go调度器 - Go Scheduler Golang中的调度(3):并发- Concurrency本部分内容主要讨论操作系统层次的调度器工作机制。引言Go调度器能使你的多线程Go应用程序运行得更加有...原创 2019-12-12 19:47:39 · 707 阅读 · 0 评论