前三个教程: - [Go Module 教程第 1 部分:为什么和做什么](https://studygolang.com/articles/24580) - [Go Module 教程第 2 部分:项目、依赖和 gopls](https://studygolang.com/articles/35202) - [Go Module 教程第 3 部分:最小版本选择](https://studygolang.com/articles/35210) > 注意,该教程基于 Go1.13。...
-
Go Module 教程第 4 部分:镜像、校验和以及 Athens
-
理解真实世界中Go的并发BUG【阅读笔记】
有几个学生研究归纳了go编程中的并发bugs,发表了一篇(英文)论文。论文原文地址:https://songlh.github.io/paper/go-study.pdf 在此做一个笔记,便于查阅。 文章以六个产品级go应用作为研究对象:Docker、Kubernetes、etcd、gRPC、CockroachDB、BoltDB,总共研究了这些应用中的171个bug,研究它们的根本原因,并重现这些bugs,以及检查它们的修复补丁。最后用两个现有go并发bug检测器测试了这些bug。 文章试图回答...
-
golang 分析调试高阶技巧
layout: post title: "golang 调试高阶技巧" date: 2020-6-03 1:44:09 +0800 categories: golang GC 垃圾回收 golang 高阶调试 Golang tools nm compile objdump pprof trace 单元测试 执行单元测试 go test 运行 编译,运行 统计代码覆盖率 程序 Debug dlv 调试用法 调试二进制 调试进程 调试 core 文件 调试常用语法 系统整理 应用举例 gdb 调试 ...
-
Go-for range
Go中 有关循环,有两种,一种是for i :=0;i < len(x); i++ 的经典模式,另外一种是for k, v := range xxx。在用第二种方式时,有一些坑,这儿简单总结一下,希望对跟我一样有疑惑的朋友 有所帮助~ 1 for range 支持的数据类型 for range 目前支持slice、map、string以及channel。 在每一种的使用过程中编译器都会对其做转换。接着往下看 2 for range 应用与原理 2.1 slice 与 array 为了方便讲解,下...
-
Go语言学习 - Understanding Lock
Introduction 我们从零开始想象mutex是怎么上锁的, 假设我们规定一种游戏规则: "你必须把这个数字从0变成1". 改成的人算赢, 没改成的人就等着. 等刚刚赢的人再把数字改回0, 这样你就有机会再抢一把了. 这就是mutex上锁的基本原理. 再进一步的, 有如下两个细节: 现在有两个线程并行, 他们出手的时候都看到这个是0, 过会儿他们都把这个数字改成1, 这个锁被上了两回, 而且他们都认为自己是对的: "我看到的时候它的确是0呀?我错在哪儿了?" 第一个人用完锁了, 其他人如何...
-
Go 语言中的集成测试:第二部分 - 设计和编写测试
## 序幕 这篇文章是集成测试系列两个部分中的第二部分。你可以先读 [第一部分:使用 Docker 在有限的环境中执行测试](https://studygolang.com/articles/21759)。本文中的示例可以从 [代码仓库](https://github.com/george-e-shaw-iv/integration-tests-example) 获取。 ## 简介 > “比起测试行为,设计测试行为是已知的最好的错误预防程序之一。” —— Boris Beizer 在执行...
-
Go 语言中的集成测试:第一部分 - 用 Docker 执行测试
## 简介 > “测试会带来失败,而失败会带来理解。” —— Burt Rutan Burt Rutan 是一名航空航天工程师,他设计了 Voyager,这是第一架在不停车或加油的情况下环球飞行的飞机。虽然 Rutan 不是软件工程师,但他的话充分说明了测试的重要性,甚至是软件测试。所有形式的软件测试都非常重要,无论是单元、集成、系统还是验收测试。但是,根据项目的不同,一种形式的测试可能比其他形式更有价值。换句话说,有时一种形式的测试可以比其他形式更好地反映软件的健康和完整性。 ...
-
【译】CPU 高速缓存原理和应用
博客原文: 【译】CPU 高速缓存原理和应用 曾三次获得 F1 世界冠军的杰基•斯图尔特 (Jackie Stewart) 表示,了解汽车的工作原理让他成为了一名更好的驾驶员。 "你并不需要先成为一个工程师才能去做一个赛车手,但是你得有一种机械同感 (Mechanical Sympathy)" Martin Thompson (高性能消息库 LMAX Disruptor 的设计者) 就一直都把机械同感的理念应用到编程中。简而言之,了解计算机底层硬件能让我们作为一个更优秀的开发者去设计算法、数据结...
-
探索 Go 中接口的性能
问题 在 Go 中使用接口(interface{})好像有性能问题,但是真的如此吗,或者我们有哪些可以提升的空间,来看一下 golang 的一个 issue。例子中跑了三个 benchmark,一个是接口调用,一个是直接调用,后面我又加了一个接口断言后调用。 import ( "testing" ) type D interface { Append(D) } type Strings []string func (s Strings) Append(d D) {} func Benchmark...
-
Go 项目标准布局(结构)
https://github.com/golang-standards/project-layout 项目总结了 Go 项目的布局,这是Go应用程序项目的基本布局,并不是Go核心开发团队定义的官方标准;但是,这是Go生态系统中的一种常见的项目布局模式。 Go目录 /cmd 该目录用于存放 Go 项目的入口,即 main.go。一般来说,我们应该在 cmd 目录下创建子目录,子目录名称代表可执行程序的名称(例如/cmd/myapp)。上面列出的优秀开源项目基本上遵循了这一规则。 一般来说,该目录中...
-
Golang 性能测试 (3) 协程追踪术
本文简单介绍 golang 如何做跟踪刨析。 简介 对于绝大部分服务,跟踪刨析是用不到的。但是如果遇到了下面问题,可以不妨一试: 怀疑哪个协程慢了 系统调用有问题 协程调度问题 (chan 交互、互斥锁、信号量等) 怀疑是 gc (Garbage-Collect) 影响了服务性能 网络阻塞 等等 坦白的讲,通过跟踪刨析可以看到每个协程在某一时刻在干什么。 做跟踪刨析,首先需要获取trace 数据。可以通过代码中插入trace, 或者上节提到的通过pprof 下载即可。 Example Code ...
-
golang 性能测试 (1)
本文介绍golang 如何做基准性能测试。 编写完代码除了跑必要的单元测试外,还需要考虑代码跑起来的性能如何。性能的衡量其实就是程序运行时候进程的内存分配,CPU消耗情况。 golang 语言在提供了功能测试的基础上,提供了丰富的性能测试功能。 SHOW CODE 首先,从一个例子来讲起。 随便写一个简单的快速排序,然后和系统自带的排序做一个性能比较。 如下为简版快排的代码: package benchmark import "sort" func QSort(data []int) { myq...
-
Golang 性能测试 (2) 性能分析
本文介绍 golang 如何做性能分析。 对服务做了基准性能测试后,如果服务出现问题,可以通过性能分析工具,查出消耗资源的瓶颈,并做针对性的性能优化。 Golang 语言也为我们提供了方便的性能分析工具pprof,方便我们做必要的服务优化。pprof 可以做cpu分析,统计所有调用方法执行的时间片(通过采样); 可以查看内存分配,找到是否有内存泄漏,哪里泄露了(调用栈);还可以查看Block、事件调用,互斥锁等。可谓麻雀虽小,五脏俱全。Golang 提供了两种分析的工具,一种是web工具,直接引...
-
超详细Go语言源码目录说明
开源项目「go home」聚焦Go语言技术栈与面试题,以协助Gopher登上更大的舞台,欢迎go home~ 导读 学习Go语言源码的第一步就是了解先了解它的目录结构,你对它的源码目录了解多少呢?今天我整理了一份超详细的Go语言源码目录说明,基于Go1.14版本整理,欢迎收藏~ 目录总览 . ├── AUTHORS ├── CONTRIBUTING.md ├── CONTRIBUTORS ├── LICENSE ├── PATENTS ├── README.boringcrypto.md ├──...
-
Go: 监控模式
![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-monitor-pattern/1.png) Go 能实现[监控模式](https://en.wikipedia.org/wiki/Monitor_%28synchronization%29),归功于 `sync` 包和 `sync.Cond` 结构体。监控模式允许 goroutine 在进入睡眠模式前等待一个定特定条件,而不会阻塞执行或消耗资源。...
-
Dig101:Go之读懂map的底层设计
Dig101: dig more, simplified more and know more 在golang中,map是一个不可或缺的存在。 它作为哈希表,简单易用,既能自动处理哈希碰撞,又能自动扩容或重新内存整理,避免读写性能的下降。 这些都要归功于其内部实现的精妙。本文尝试去通过源码去分析一下其背后的故事。 我们不会过多在源码分析上展开,只结合代码示例对其背后设计实现上做些总结,希望可以简单明了一些。 希望看完后,会让你对 map 的理解有一些帮助。网上也有很多不错的源码分析,会附到文末,...
-
Dig101:Go之灵活的slice
Dig101: dig more, simplified more and know more Slice作为go常用的数据类型,在日常编码中非常常见。相对于数组的定长不可变,slice使用起来就灵活了许多。 0x01 slice 到底是什么? 首先我们看下源码中slice结构的定义 // src/runtime/slice.go type slice struct { array unsafe.Pointer len int cap int } slice数据结构如上,Data指向底层引用的数...
-
Golang中的Defer必掌握的7知识点
在用Golang开发的时候,defer这个语法也是必备的知识,但是我们除了知道他是在一个函数退出之前执行,对于defer是否还有其他地方需要注意的呢。 本文整理的defer的全场景使用情况,部分场景源自网络,加上自己的额外观点和分析,完成了这份defer的7个隐性必备知识点。 提纲如下: 知识点1: defer的执行顺序 知识点2:defer与return谁先谁后 知识点3:函数的返回值初始化与defer间接影响 知识点4:有名函数返回值遇见defer情况 知识点5:defer遇见panic 知...
-
Go 测试高级窍门和技巧
2017 年 2 月 1 日 · 5 min 阅读 这篇文章基于我在 [维尔纽斯的 Golang 交流会](https://www.meetup.com/Vilnius-Golang/) 上的演讲。 我读了很多博客,看了很多演讲并把所有这些窍门和技巧都集中在一个地方。首先我想感谢那些提出这些想法并把它们分享到社区的人。我从下面的这些工作中借鉴了资料和示例: - [Andrew Gerrand - Testing Techniques](https://talks.golang....
-
Uber Go 语言编码规范
Uber Go 语言编码规范 Uber 是一家美国硅谷的科技公司,也是 Go 语言的早期 adopter。其开源了很多 golang 项目,诸如被 Gopher 圈熟知的 zap、jaeger 等。2018 年年末 Uber 将内部的 Go 风格规范 开源到 GitHub,经过一年的积累和更新,该规范已经初具规模,并受到广大 Gopher 的关注。本文是该规范的中文版本。本版本会根据原版实时更新。 版本 当前更新版本:2019-11-13 版本地址:commit:#71 如果您发现任何更新、问题...
-
go 学习笔记之10 分钟简要理解 go 语言闭包技术
**闭包**是主流编程语言中的一种**通用技术**,常常和**函数式编程**进行强强联合,本文主要是介绍 `Go` 语言中什么是闭包以及**怎么理解闭包**. 如果读者对于 `Go` 语言的闭包**还不是特别清楚**的话,可以**参考上一篇文章** [go 学习笔记之仅仅需要一个示例就能讲清楚什么闭包](https://mp.weixin.qq.com/s/ZIIBvCuDgrsdNbQXBeAR9A). 或者也可以**直接无视**,因为接下来会**回顾一下前情概要**,现在你准备好...
-
细说Golang的JSON解析
之前一直写一些动态语言,觉得解析JOSN还是很简单的,往往只需要几行代码就能拿到解析好的JSON对象。Go语言自带的json包可以让你在程序中方便的读取和写入 JSON 数据。生成JSON场景相对简单一些,json.Marshal()会根据传入的结构体生成JSON数据。解析JSON会把数据解析到结构体中,由于JSON格式的自由组合的特点,尤其是那些结构复杂的JSON数据对新手来说声明接受JSON数据的结构体类型就会陷入不知从何下手的困扰。 最近工作中由于要解析JS和PHP程序持久化的JSON数据...
-
Go 的调度器追踪
## 简介 我喜欢 Go 语言的一个原因就是因为它可以生成分析和调试信息。当程序在执行的时候 Go 有一个特殊的环境变量 GODEBUG,它在运行阶段可以生成调试信息。你可以获取程序回收器和调度器的概要信息以及详细的信息。更主要的是你不需要添加任何的额外工作重新编译就可以完成调试 在这篇文章里,我将通过一个简单的 Go 程序演示如果使用调度跟踪信息。如果你对调度器有一定的了解那么它对你是用的。我建议先阅读下面两篇文章: 并发、goroutines 和 GOMAXPROCS ...
-
Go 问答之如何阅读 Go 源码
我的知乎回答,问题是关于如何阅读 Go 源码。地址。胡扯了些自己的想法。 Go 的源码在安装包的 src/ 目录下。怎么看它的源码呢?直接看吧!没人教的情况下,只能自己撸了。当然,这种内容一般也不会有人教。 怎么撸? Go 源码中,应该可分为与语言息息相关的部分,和官方提供的标准库。与语言实现相关的肯定是最难的,不是那么容易理解。可以先主要看标准库,其他的可以先大概了解下。 先把源码目录整体扫一遍,大概看看涉及了哪些模块,然后再挑自己喜欢的部分进行更深一步的学习与研究。建议每个目录都简单写个 h...
-
Go 1.14中值得关注的几个变化
可能是得益于2020年2月26日Go 1.14的发布,在2020年3月份的TIOBE编程语言排行榜上,Go重新进入TOP 10,而去年同期Go仅排行在第18位。虽然Go语言以及其他主流语言在榜单上的“上蹿下跳”让这个榜单的权威性饱受质疑:),但Go在这样的一个时间节点能进入TOP 10,对于Gopher和Go社区来说,总还是一个不错的结果。并且在一定层度上说明:Go在努力耕耘十年后,已经在世界主流编程语言之林中牢牢占据了自己的一个位置。 图:TIOBE编程语言排行榜2020.3月榜单,Go语言重...
-
Go 官方博文 Module 第四部分:v2 及更高版本
## 简介 本文是 Go modules 系统的第四部分 - Part 1: [使用 Go Modules](https://blog.golang.org/using-go-modules) [译文](https://studygolang.com/articles/19334) - Part 2: [迁移到 Go Modules](https://blog.golang.org/migrating-to-go-modules) [译文](https://studygolan...
-
Go 官方博文 Module 第三部分:发布 Go Modules
## 简介 本文是 go modules 系统的第三部分 - Part 1: [使用 Go Modules](https://blog.golang.org/using-go-modules) [译文](https://studygolang.com/articles/19334) - Part 2: [迁移到 Go Modules](https://blog.golang.org/migrating-to-go-modules) [译文](https://studygolan...
-
使用 Go Modules(模块)进行依赖项迁移
## 介绍 本篇文章是 Go Modules 系列文章的第 2 部分。第 1 部分请参阅 [Go Modules 的使用方法(中文翻译版)](https://studygolang.com/articles/19334) [Using Go Modules(EN)](https://blog.golang.org/using-go-modules) Go 项目使用各种各样的依赖关系管理策略,像 `dep` 和 `glide` 这样的第三方依赖项[vendor](https...
-
Module 第 1 部分:为什么和做什么
## 引言 Module 针对自 Go 语言初版发布以来即成为开发者痛点的三个关键问题提供了完整的解决方案,使得开发者: * 能够在 GOPATH 工作区之外使用 Go 代码; * 能够对依赖包进行版本控制并识别可以使用的最兼容版本; * 能够使用 Go 原生工具来管理依赖包; 随着 Go 语言 1.13 版本的发布,这三个问题已经成为了“过去时”。在过去的两年中,Go 语言团队花费了很多精力才让所有人达到这一步。在本文中,我将重点介绍从 GOPATH 到 module 的...
-
了解 Go 的不可寻址值和切片
Dave Cheney 最近在 Twitter 上发布了一个 Go 的小测验,和往常一样,我从中学到了一些有趣的东西。让我们从他的推文开始: `#golang` 小测验:该程序打印什么? ```go package main import ( "crypto/sha1" "fmt" ) func main() { input := []byte("Hello, playground") hash := sha1.Sum(input)...
-
Go Modules 终极入门
Go modules 是 Go 语言中正式官宣的项目依赖解决方案,Go modules(前身为vgo)于 Go1.11 正式发布,在 Go1.14 已经准备好,并且可以用在生产上(ready for production)了,Go官方也鼓励所有用户从其他依赖项管理工具迁移到 Go modules。 而 Go1.14,在近期也终于正式发布,Go 官方亲自 “喊” 你来用: 因此在今天这篇文章中,我将给大家带来 Go modules 的 “终极入门”,欢迎大家一起共同探讨。 Go modules 是...
-
Go内存分配那些事,就这么简单!
原文链接:mp.weixin.qq.com/s/3gGbJaeuv… 新老朋友好久不见,我是大彬,这篇文章准备了很久,不是在拖延,而是中间做了一些其他事情,耽搁了一些。 这篇文章主要介绍Go内存分配和Go内存管理,会轻微涉及内存申请和释放,以及Go垃圾回收。 从非常宏观的角度看,Go的内存管理就是下图这个样子,我们今天主要关注其中标红的部分。 友情提醒: 文章有点长,建议先收藏,后阅读,绝对是学习内存管理的好资料。 本文基于go1.11.2,不同版本Go的内存管理可能存在差别,比如1.9与1.1...
-
Golang 大杀器之性能剖析 PProf
Golang 大杀器之性能剖析 PProf 前言 写了几吨代码,实现了几百个接口。功能测试也通过了,终于成功的部署上线了 结果,性能不佳,什么鬼????? 想做性能分析 PProf 想要进行性能优化,首先瞩目在 Go 自身提供的工具链来作为分析依据,本文将带你学习、使用 Go 后花园,涉及如下: runtime/pprof:采集程序(非 Server)的运行数据进行分析 net/http/pprof:采集 HTTP Server 的运行时数据进行分析 是什么 pprof 是用于可视化和分析性能分...
-
Golang 大杀器之跟踪剖析 trace
image 原文地址:Golang 大杀器之跟踪剖析 trace 在 Go 中有许许多多的分析工具,在之前我有写过一篇 《Golang 大杀器之性能剖析 PProf》 来介绍 PProf,如果有小伙伴感兴趣可以去我博客看看。 但单单使用 PProf 有时候不一定足够完整,因为在真实的程序中还包含许多的隐藏动作,例如 Goroutine 在执行时会做哪些操作?执行/阻塞了多长时间?在什么时候阻止?在哪里被阻止的?谁又锁/解锁了它们?GC 是怎么影响到 Goroutine 的执行的?这些东西用 PP...
-
高性能 Go 服务的内存优化(译)
原文地址: Allocation Efficiency in High-Performance Go Services, 没有原模原样的翻译, 但不影响理解。 关于工具 我们的第一个建议就是: 不要过早优化。Go 提供了很棒的性能调优工具可以直接指出代码上哪里消耗了大量内存。没必要重复造轮子,建议读者阅读下 Go 官方博客上的这篇很赞的文章;里面会一步步教你使用 pprof 对 CPU 和内存进行调优。在 Segment 我们也是用这些工具去找到项目的性能瓶颈的。 用数据来驱动优化。 逃逸分析 ...
-
浅谈 Go 语言 select 的实现原理
Home Menu 浅谈 Go 语言 select 的实现原理 30 Mar 2019 Select Channel 并发编程 Golang Go实现原理 概述 结构 现象 非阻塞的收发 随机执行 编译期间 直接阻塞 独立情况 非阻塞操作 发送 接收 通用情况 运行时 初始化 循环 总结 相关文章 Reference 很多 C 语言或者 Unix 开发者听到 select 想到的都是系统调用,而谈到 I/O 模型时最终大都会提到基于 select、poll 和 epoll 等函数构建的 IO 多...
-
聊一聊golang的结构体标签
前言Golang的结构体标签可能每一个Gopher都在用,尤其是在json处理的地方用。比如: 123456type NetConf struct { Master string `json:"master"` Mode string `json:"mode"` MTU int `json:"mtu"` Debug bool `json:"debug"`} 毋庸置疑,这个 NetConf 结构体实体变量在转换 json 的时候,Master 字段会变为 json 字符串中的 “master “。...
-
GoLang内存模型
一、前言 Go语言的内存模型规定了一个goroutine可以看到另外一个goroutine修改同一个变量的值的条件,这类似java内存模型中内存可见性问题(Java内存可见性问题可以参考拙作:Java并发编程之美一书)。 当多个goroutine并发同时存取同一个数据时候必须把并发的存取的操作顺序化,在go中可以实现操作顺序化的工具有高级的通道(channel)通信和同步原语比如sync包中的Mutex(互斥锁)、RWMutex(读写锁)或者和sync/atomic中的原子操作。 二、Happe...
-
Go Mock 测试
( 在开发的过程中 ) 你应该一直都写测试。不管使用什么语言,为了完全的理解如何能写出生产环境级别的应用,你应该拥有写单元测试的能力。有些人把测试驱动 (TDD) 做到极致。TDD 提倡你在写功能之前写测试。当你尝试写一些容易测试的代码的时候,这是个好方法。直到现在,我发现 TDD 很像 agile ( 敏捷软件开发 ); 很多人说他们有做测试驱动,但是实际中,他们只在一些混合的版本中做。到最后,它归根到底像,在吃牛排之前吃蔬菜的问题。( 西餐中 ) 比较健康的吃法是先吃蔬菜,然后吃牛排。就像在...
-
golang中Context的使用场景
golang中Context的使用场景context在Go1.7之后就进入标准库中了。它主要的用处如果用一句话来说,是在于控制goroutine的生命周期。当一个计算任务被goroutine承接了之后,由于某种原因(超时,或者强制退出)我们希望中止这个goroutine的计算任务,那么就用得到这个Context了。关于Context的四种结构,CancelContext,TimeoutContext,DeadLineContext,ValueContext的使用在这一篇快速掌握 Golang c...
-
golang协程池设计
Why Pool go自从出生就身带“高并发”的标签,其并发编程就是由groutine实现的,因其消耗资源低,性能高效,开发成本低的特性而被广泛应用到各种场景,例如服务端开发中使用的HTTP服务,在golang net/http包中,每一个被监听到的tcp链接都是由一个groutine去完成处理其上下文的,由此使得其拥有极其优秀的并发量吞吐量 for { // 监听tcp rw, e := l.Accept() if e != nil { ....... } tempDelay = 0 c :=...
-
Golang GC算法
概括 Go的垃圾回收官方形容为 非分代 非紧缩 写屏障 三色并发标记清理算法。 非分代:不像Java那样分为年轻代和年老代,自然也没有minor gc和maj o gc的区别。 非紧缩:在垃圾回收之后不会进行内存整理以清除内存碎片。 写屏障:在并发标记的过程中,如果应用程序(mutator)修改了对象图,就可能出现标记遗漏的可能,写屏障就是为了处理标记遗漏的问题。 三色:将GC中的对象按照搜索的情况分成三种: 黑色: 对象在这次GC中已标记,且这个对象包含的子对象也已标记 灰色: 对象在这次GC...
-
golang条件编译
开篇 golang中没有类似C语言中条件编译的写法,比如在C代码中可以使用如下语法做一些条件编译,结合宏定义来使用可以实现诸如按需编译release和debug版本代码的需求 #ifndef #define ... #end 但是golang支持两种条件编译方式 编译标签( build tag) 文件后缀 编译标签( build tag) 在源代码里添加标注,通常称之为编译标签( build tag),编译标签是在尽量靠近源代码文件顶部的地方用注释的方式添加 go build在构建一个包的时候会...
-
Go语言并发与并行
首先,并行!=并发, 两者是不同的 Go语言的goroutines、信道和死锁 goroutine Go语言中有个概念叫做goroutine, 这类似我们熟知的线程,但是更轻。 以下的程序,我们串行地去执行两次loop函数: func loop() { for i := 0; i < 10; i++ { fmt.Printf("%d ", i) } } func main() { loop() loop() } 毫无疑问,输出会是这样的: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 ...
-
Golang - 调度剖析【第一部分】
简介 首先,Golang 调度器的设计和实现让我们的 Go 程序在多线程执行时效率更高,性能更好。这要归功于 Go 调度器与操作系统(OS)调度器的协同合作。不过在本篇文章中,多线程 Go 程序在设计和实现上是否与调度器的工作原理完全契合不是重点。重要的是对系统调度器和 Go 调度器,它们是如何正确地设计多线程程序,有一个全面且深入的理解。 本章多数内容将侧重于讨论调度器的高级机制和语义。我将展示一些细节,让你可以通过图像来理解它们是如何工作的,可以让你在写代码时做出更好的决策。因为原理和语义是...
-
Golang - 调度剖析【第二部分】
回顾本系列的第一部分,重点讲述了操作系统调度器的各个方面,这些知识对于理解和分析 Go 调度器的语义是非常重要的。在本文中,我将从语义层面解析 Go 调度器是如何工作的,并重点介绍其高级特性。Go 调度器是一个非常复杂的系统,我们不会过分关注一些细节,而是侧重于剖析它的设计模型和工作方式。我们通过学习它的优点以便够做出更好的工程决策。 开始 当 Go 程序启动时,它会为主机上标识的每个虚拟核心提供一个逻辑处理器(P)。如果处理器每个物理核心可以提供多个硬件线程(超线程),那么每个硬件线程都将作为...
-
《Go语言四十二章经》第二章 数据类型
《Go语言四十二章经》第二章 数据类型 作者:李骁 在 Go 语言中,数据类型可用于参数和变量声明。 ## 2.1 基本数据类型 Go 语言按类别有以下几种数据类型: * 布尔型:<br> 布尔型的值只可以是常量 true 或者 false。一个简单的例子:`var b bool = true`。 * 数字类型:<br> 整型 int 和浮点型 float32、float64,Go 语言支持整型和浮点型数字,并且原生支持复数,其中位的运算采用补码。 ...
-
Golang 限速器
限速器 之前看到这篇golang并发编程的两种限速方法,觉得 sleep 等待的方式不是特别好,唤醒线程的时间比较长。而且1s内的请求只能均匀的到来,如瞬间来 N 个, 那么只有一个能立刻返回,剩下的只能等待。 【修正】根据下图的说明,无论是 sleep 还是 chan block, 发生的事情都是 G 和 P 分离,等待下次轮训,再接着执行,所以可能性能是几乎一样的。(这种说法可能不准确,没有深入) 限速器的作用还是比较重要的,特别是协程使用较多的应用,如果不加限制,可能会OOM。 简单说下思...
-
Go的50坑:新Golang开发者要注意的陷阱、技巧和常见错误[2]
目录 初级篇 开大括号不能放在单独的一行 未使用的变量 未使用的Imports 简式的变量声明仅可以在函数内部使用 使用简式声明重复声明变量 偶然的变量隐藏Accidental Variable Shadowing 不使用显式类型,无法使用“nil”来初始化变量 使用“nil” Slices and Maps Map的容量 字符串不会为“nil” Array函数的参数 在Slice和Array使用“range”语句时的出现的不希望得到的值 Slices和Arrays是一维的 访问不存在的Map ...