Go 调优技术

## 内存管理 在开始探索 Go 调优技术和工具之前,我们需要先了解一下 Go 内存模型,它可以帮助我们理解内存是如何使用的。 Go 实现的是 _并行的_ [标记-清除垃圾回收器](http://wiki.c2.com/?MarkAndSweep)。在 _传统的_ 标记-清除模型中,垃圾回收器会先让程序停下来(也就是,“stop the world”),然后查找已经失效的对象,并把这些对象清理掉(也就是,释放内存)。因为程序在运行中会移动引用(references),导致垃圾的识别和...阅读全文

2017-12-20 23:38:13 polaris
阅读:9672 评论:2

为什么 Goroutine 能有上百万个,Java 线程却只能有上千个?

为什么 Goroutine 能有上百万个,Java 线程却只能有上千个? 很多有过 JVM 相关语言工作经验的程序员或许都遇到过如下问题: [图片上传失败...(image-d56f9b-1532356059594)] 额,超出 thread 限制导致内存溢出。在作者的笔记本的 linux 上运行,这种情况一般发生在创建了 11500 个左右的 thread 时候。 但如果你用 Go 语言来做类似的尝试,每创建一个 Goroutine ,并让它永久的 Sleep ,你会得到一个完全不同的结果。在...阅读全文

2018.07.23 22:17* freelang
阅读:2660 评论:2

Golang并发:一招掌握无阻塞通道读写

介绍Golang并发的模型写了几篇了,但一直没有以channel为主题进行介绍,今天就给大家聊一聊channel,channel的基本使用非常简单,想必大家都已了解,所以直接来个进阶点的:介绍channel的阻塞情况,以及给你一个必杀技,立马解决阻塞问题,实用性高。 阻塞场景 无论是有缓存通道、无缓冲通道都存在阻塞的情况。阻塞场景共4个,有缓存和无缓冲各2个。 无缓冲通道的特点是,发送的数据需要被读取后,发送才会完成,它阻塞场景: 通道中无数据,但执行读通道。 通道中无数据,向通道写数据,但无协...阅读全文

2018-12-27 15:34:47 大彬
阅读:712 评论:0

Go 开发目录结构

在实际的项目中发现大家的目录结构都比较凌乱,基本每个人都有每个人的风格,一个项目在不断地变大,一些新的文件或目录又不断地被添加进来,从这里面去找到自己需要的信息的成本越来越高,一个统一的通用的目录结构非常有必要。 以下内容来自于github上的这个项目(https://github.com/golang-standards/project-layout) /cmd main函数文件(比如 /cmd/myapp.go)目录,这个目录下面,每个文件在编译之后都会生成一个可执行的文件。 不要把很多的代...阅读全文

阅读:3737 评论:0

八、Golang过程式编程

Golang过程式编程 1、接口型函数 用函数实现接口,这样在调用的时候就会非常简便,这一类型的函数就叫做接口型函数;使用情景:仅限于只有一个函数签名的接口。 原始使用,请看如下使用案例: type Handle interface { Done (k , v interface{}) } func each(m map[interface{}]interface{}, h Handle) { if m != nil && len(m) > 0 { for k, v := range m { h...阅读全文

阅读:674 评论:0

用Go语言写了7年HTTP服务之后【译】

趁着元旦休假+春节,尝试把2018年期间让我受益的一些文章、问答,翻译一下。欢迎指正、讨论,希望对你也有所帮助。原文:How I write Go HTTP services after seven years 以下,开始正文我从r59(1.0版本之前的版本)便开始使用Go,过去7年里一直用Go来编写API和HTTP服务。在Machine Box(译者注:作者公司),写各式各样的API是我的主要工作。我们是做机器学习的,机器学习本身又很复杂,我编写的API就是为了让开发者更容易理解和接入机器学习...阅读全文

阅读:1036 评论:0

编译型语言、解释型语言、静态类型语言、动态类型语言概念与区别

最近在研究Python和Golang。反复提到动态类型语言、动态语言、解释型语言这些概念。这些概念很生涩,在这里做一个总结。 编译型语言和解释型语言 1、编译型语言 需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件。 优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行...阅读全文

2019.02.15 14:28 Legendary
阅读:4327 评论:0

golang协程池设计

Why Pool go自从出生就身带“高并发”的标签,其并发编程就是由groutine实现的,因其消耗资源低,性能高效,开发成本低的特性而被广泛应用到各种场景,例如服务端开发中使用的HTTP服务,在golang net/http包中,每一个被监听到的tcp链接都是由一个groutine去完成处理其上下文的,由此使得其拥有极其优秀的并发量吞吐量 for { // 监听tcp rw, e := l.Accept() if e != nil { ....... } tempDelay = 0 c :=...阅读全文

2019-02-18 17:34:44 薛薛薛
阅读:2159 评论:0

Go Reflect 性能

Go reflect包提供了运行时获取对象的类型和值的能力,它可以帮助我们实现代码的抽象和简化,实现动态的数据获取和方法调用, 提高开发效率和可读性, 也弥补Go在缺乏泛型的情况下对数据的统一处理能力。 通过reflect,我们可以实现获取对象类型、对象字段、对象方法的能力,获取struct的tag信息,动态创建对象,对象是否实现特定的接口,对象的转换、对象值的获取和设置、Select分支动态调用等功能, 看起来功能不错,但是大家也都知道一点: 使用reflect是有性能代价的! 测试 Java...阅读全文

2019年01月29日 smallnest
阅读:751 评论:1

golang 面试题整理

1、go的调度 2、go struct能不能比较 因为是强类型语言,所以不同类型的结构不能作比较,但是同一类型的实例值是可以比较的,实例不可以比较,因为是指针类型 3、go defer(for defer),先进后出,后进先出 4、select可以用于什么,常用语gorotine的完美退出 golang 的 select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作每个case语句里必须是一个IO操作,确切的说,应该是一个面向channel的IO操作 5、context包的用途Co...阅读全文

2019.03.05 21:34 stevenlife
阅读:3269 评论:0

图解Go语言内存分配

目录 基础概念 内存管理单元 内存管理组件 mcache mcentral mheap 内存分配流程 总结 参考资料 Go语言内置运行时(就是runtime),抛弃了传统的内存分配方式,改为自主管理。这样可以自主地实现更好的内存使用模式,比如内存池、预分配等等。这样,不会每次内存分配都需要进行系统调用。 Golang运行时的内存分配算法主要源自 Google 为 C 语言开发的TCMalloc算法,全称Thread-Caching Malloc。核心思想就是把内存分为多级管理,从而降低锁的粒度。...阅读全文

2019-03-13 08:29 qcrao-2018
阅读:2032 评论:1

Go语言的美好和丑陋

Go语言的美好和丑陋 程序师 2018-04-19 7063 阅读 go 业界观察 这是一个“ Go不好 ”系列的额外文章。Go确实有一些不错的特性,也就是本文中“好的”部分,但是当我们不使用API或者网络服务器(这是为它设计的)而且将它用于业务领域逻辑的时候,总体而言我发现它用起来笨重且糟糕。但是即使在用于网络编程的时候,在设计和实现方面它也有很多缺陷,这导致它在显而易见的简单的表面之下是危险的。 促使我写这篇文章的原因就是最近我又开始用Go做一个副项目。在我之前的工作我广泛地使用Go来写网络...阅读全文

2018-06-28 01:10 为程序员服务
阅读:1630 评论:0

go1.12下Go mod使用实践

Go Module是Go会在1.12中正式推出的包管理机制。 Go mod 简介 Golang一直存在一个被人诟病的问题是缺少一个官方的包依赖管理工具。从我个人的角度上来看存在两个问题: GOPATH特性对于多工程的情况下,支持不算友好。 GOPATH无法对依赖包进行有效的版本管理,没有任何地方能够表明依赖包的具体版本号,无法简单清晰获取到有效的依赖包版本信息等。 在Go1.11时,官方推出了go mod作为官方的依赖管理工具。而go mod与之前的利用vendor特性的依赖管理工具的不同点在于...阅读全文

2019.06.18 08:33 会飞的鲶鱼
阅读:4112 评论:2

Go 语言实战: 编写可维护 Go 语言代码建议

介绍 大家好,我在接下来的两个会议中的目标是向大家提供有关编写 Go 代码最佳实践的建议。 这是一个研讨会形式的演讲,不会有幻灯片,而是直接从文档开始。 贴士: 在这里有最新的文章链接https://dave.cheney.net/practical-go/presentations/qcon-china.html 编者的话 终于翻译完了 Dave 大神的这一篇《Go 语言最佳实践》 耗时两周的空闲时间 翻译的同时也对 Go 语言的开发与实践有了更深层次的了解 有兴趣的同学可以翻阅 Dave 的...阅读全文

2019-07-29 19:32:32 法克喜特
阅读:960 评论:0

使用 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...阅读全文

2019-08-28 10:30:46 polaris
阅读:5005 评论:2