![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
go
lz404
偶尔很认真
展开
-
GO性能优化指北-高效内存分配
绝大多数时候我们不需要关注内存管理, go运行时会自行处理, 但是对于热点路径, 我们必须确保高效地内存分配来榨取每一点性能就内存分配而言, 有两件事情可以帮助我们提升性能: 1. 减少分配, 如将fmt.Sprintf改为fmt.Fprintf来避免创建新的字符串或者尽量使用[]byte而不是string来重用 2. 尽量避免在堆上的分配, 分配在堆的内存会增加GC花费从而降低性能, 本文将试...原创 2020-04-20 18:23:09 · 610 阅读 · 0 评论 -
GO工具链简易入门-go vet
文章目录快速上手go vet会检查什么?查找所有选项对于原子性函数的不寻常使用(atomic)锁复制(copylocks)循环闭包(loopclosure)没有取消context(lostcancel)没有实现标准库要求接口(stdmethods)不合约定的字段标签(structtag)其他选项定制分析器定制指令参考快速上手一个简单的命令就是go vet [directory]返回结果大约如...原创 2020-04-17 15:09:43 · 911 阅读 · 0 评论 -
GO标准库巡礼-context
简述context包的核心内容是定义了Context类型,Context可以携带DDL信号、取消信号以及基于请求的数据在函数之间传递。context一个常见的应用场景是在服务器处理请求上。这个过程我们可能会创建很多goroutine来完成对请求的处理,一方面我们往往需要一个全局性的方式能够快速的结束所有goroutine,其中的原因可能是用户停止了请求或者说处理已经超时没必要继续处理,另一方面...原创 2020-03-26 15:06:57 · 164 阅读 · 0 评论 -
GO-如何设置可选参数
什么是可选参数(optional parameter)?可能很多人没明白什么是可选参数,可选参数即我们可以设置也可以不设置的参数,如果我们不设置,则会使用默认值。在JAVA中我们可以用函数重载(overloading)来实现可选参数(如下述代码所示),可以看到如果我们不需要修改A我们可以直接使用doSomething,如果我们需要修改A,可以使用doSomethingpublic class...原创 2020-03-26 15:04:51 · 3075 阅读 · 0 评论 -
GO标准库巡礼-fmt
fmt模板fmt中的转义词%v通用占位符,该占位符会自动转换变量为string(以默认选项)。通常用于转换基础类型%#v会将变量转换为符合go syntax的输出,也就是说我们可以直接复制输出结果然后粘贴到代码中而不会报错。我们可以看一个例子来加深理解func main() { c := struct { hello string world string }{"...原创 2020-03-24 16:52:50 · 154 阅读 · 0 评论 -
GO标准库巡礼-strconv
作为初学者,我们可能常常首先接触到的是 fmt 包,但是对于基础类型的转换而言, strconv 包更加高效且允许编译器类型检查。strconv 针对四种基础类型提供了相应的函数:布尔值,整数,浮点数和字符串。整数操作如何从字符串中解析出有符号整数和无符号整数?如何将有/无符号整数转化为字符串浮点数操作如何从字符串中解析出浮点数?我们可以使用ParseFloat函数,函数定义...原创 2020-03-23 16:09:30 · 173 阅读 · 0 评论 -
GO标准库巡礼-encoding/binary
encoding/binary回想区为什么除了encoding/json,我们还需要encoding/binary?文本协议和二进制协议区别是什么?什么是字节序?能否举一个例子说明字节序不同带来的变化?为什么要引入小端法?优点是什么?什么是网络字节序?如何从字节切片中读取一个定长整数?如何将一个定长整数写入到字节切片中?如何从比特流中读取一个定长整数?如何从比特流中写入一个定长...原创 2020-03-22 16:25:19 · 1197 阅读 · 1 评论 -
GO标准库巡礼-sync
在go中sync负责提供同步原语如互斥锁等。任何属于该包类型的对象都不应该被复制(只能passed by pointer)sync.Mutexsync.Mutex是最常用的同步原语。其作用在于对共享资源的互斥访问。常用的使用范式mutex := &sync.Mutex{}mutex.Lock()// Update shared variable (e.g. slice, po...原创 2020-03-19 22:42:45 · 170 阅读 · 0 评论 -
GO标准库巡礼-bufio
声明:该系列文章是基于对@golangspec、go官方文档、《Go语言标准库》的学习汇总而成bufio封装了io.Reader和io.Writer并且通过缓存来提高性能。bufio.Writer为什么需要buffer?在没有buffer的情况下,我们的writer函数会调用系统调用来完成一次写入,而小量写入下,系统调用的时间花销远远大于写入本身的花销。因此,过多的小量写入会大大影响性能。...原创 2020-03-18 15:32:58 · 322 阅读 · 0 评论 -
GO标准库巡礼-ioutil
声明:该系列文章是基于对@benbjohnson的《Go Walkthrough》、go官方文档、《Go语言标准库》的学习汇总而成ioutil提供了一些简单的IO操作函数作为辅助Reader与ReadCloser的简单转换有些时候我们有一个io.Reader的实例,但是我们要求传递io.ReadCloser的实例,那么我们可以使用NopCloser函数func NopCloser(r io...原创 2020-03-05 17:04:36 · 274 阅读 · 0 评论 -
GO标准库巡礼-bytes与strings
声明:该系列文章是基于对@benbjohnson的《Go Walkthrough》、go官方文档、《Go语言标准库》的学习汇总而成bytes和strings简单对比[]byte表示了一组可修改、可扩展、连续性的byte列表。而string表示不可修改、固定长度、连续的byte列表。这意味着你不能更新字符串,只能创建,而这可能带来很大的负担从使用者角度来看,字符串更易于使用,能作为map的键。...原创 2020-02-23 23:18:46 · 622 阅读 · 0 评论 -
GO标准库巡礼-IO
声明:该系列文章是基于对@benbjohnson的《Go Walkthrough》、go官方文档、《Go语言标准库》的学习汇总而成io包为I/O提供了基本的接口,由于这些接口都以不同实现封装了低级操作,因此,除非另行通知,不应假定它们是线程安全的读取bytesReader接口在读取bytes上最常用到的是Reader接口,标准库的每一个模块几乎都实现了该接口type Reader int...原创 2020-02-22 18:59:12 · 303 阅读 · 0 评论 -
GO指针使用拾遗
想必大家对指针并不陌生,对于任意一个可取地址表达式(主要是变量),我们都可以用&去获取指针并传递,同时指针变量可以调用指针方法及和类型方法集,诸如此类。但是,我们有没有遇到过以下的问题在构建自己的结构体时,我应该存储的是S还是*S?为什么有些构造器,返回的是S,有些却返回的是*S?总的来说,这取决于这个结构体本身的性质,准确来说取决于这个结构体被复制的时候是安全的吗?亦或者说,...原创 2019-11-19 16:30:59 · 138 阅读 · 0 评论 -
GO对象对齐-怎么轻松降低内存占用
我们先看下面的代码var A = struct { oneByte byte anotherByte byte oneInt int }{}var B = struct { oneByte byte oneInt int anotherByte byte }{}看起来这两个变量包含的字段一模一样的,都是两个byte和一个int,那么他们的大小相同吗?我们不...原创 2019-11-14 07:46:45 · 305 阅读 · 1 评论 -
GO语言包管理速查指南
常见范式import "fmt"如果是多个package(常见)则import( "fmt" "os")怎么调用包呢?一般来说,遵循约定,比方说包路径的为"crypto/rand"的包一般调用为rand.xx但是注意的是,最终我们还是要根据源文件的package信息来决定我们的调用,比如对于import "github.com/json-iterator/go", 看起来我...原创 2019-10-31 08:59:27 · 142 阅读 · 0 评论 -
GO工具链简易入门-go list
目录快速上手一些常用指令查找编译会涉及到的所有文件查找直接依赖以及所有依赖(包括间接)使用模板函数(template function)模块版本下列举当前模块的规范名字, 版本和可取代物(replacement)列举当前模块及其所有依赖的规范名字, 版本和可取代物列举当前模块的依赖可用更新FAQ模板函数context返回的结构体模板函数module解释Module结构体如下结论参考快速上手我们...原创 2020-04-17 16:51:50 · 871 阅读 · 0 评论 -
GO运行组件浅析-内存分配
概念介绍page大小为8Kb的内存块span由多个地址连续的页(page)组成的大块内存.分配器按照页数来区分不同大小的span.但是span大小不是固定不变的,可能发生裁剪和合并操作:如果获取闲置span的时候没有找到大小合适的,就会找到一个更大的span,然后对其做裁剪操作,多余部分构成新的span被放回管理数组.如果有地址相邻的空闲span,分配器就会试图合并来构建更大的内存...原创 2020-04-18 20:22:40 · 461 阅读 · 0 评论