eFace

深度解密 Go 语言之 sync.Pool

倾然丶 夕夏残阳落幕 提交于 2020-04-27 15:23:40
最近在工作中碰到了 GC 的问题:项目中大量重复地创建许多对象,造成 GC 的工作量巨大,CPU 频繁掉底。准备使用 sync.Pool 来缓存对象,减轻 GC 的消耗。为了用起来更顺畅,我特地研究了一番,形成此文。本文从使用到源码解析,循序渐进,一一道来。 本文基于 Go 1.14 目录 是什么 有什么用 怎么用 简单的例子 fmt 包如何用 pool_test 其他 源码分析 Pool 结构体 Get pin popHead getSlow popTail Put pushHead pack/unpack GC 总结 参考资料 是什么 sync.Pool 是 sync 包下的一个组件,可以作为保存临时取还对象的一个“池子”。个人觉得它的名字有一定的误导性,因为 Pool 里装的对象可以被无通知地被回收,可能 sync.Cache 是一个更合适的名字。 有什么用 对于很多需要重复分配、回收内存的地方, sync.Pool 是一个很好的选择。频繁地分配、回收内存会给 GC 带来一定的负担,严重的时候会引起 CPU 的毛刺,而 sync.Pool 可以将暂时不用的对象缓存起来,待下次需要的时候直接使用,不用再次经过内存分配,复用对象的内存,减轻 GC 的压力,提升系统的性能。 怎么用 首先, sync.Pool 是协程安全的,这对于使用者来说是极其方便的。使用前,设置好对象的 New

Go 语言如何实现反射

旧城冷巷雨未停 提交于 2020-04-21 23:23:34
interface ,它是 Go 语言实现抽象的一个非常强大的工具。当向接口变量赋予一个实体类型的时候,接口会存储实体的类型信息,反射就是通过接口的类型信息实现的,反射建立在类型的基础上。 Go 语言在 reflect 包里定义了各种类型,实现了反射的各种函数,通过它们可以在运行时检测类型的信息、改变类型的值。 types 和 interface Go 语言中,每个变量都有一个静态类型,在编译阶段就确定了的,比如 int, float64, []int 等等。注意,这个类型是声明时候的类型,不是底层数据类型。 Go 官方博客里就举了一个例子: type MyInt int var i int var j MyInt 尽管 i,j 的底层类型都是 int,但我们知道,他们是不同的静态类型,除非进行类型转换,否则,i 和 j 不能同时出现在等号两侧。j 的静态类型就是 MyInt 。 反射主要与 interface{} 类型相关。关于 interface 的底层结构,可以参考前面有关 interface 章节的内容,这里复习一下。 type iface struct { tab * itab data unsafe . Pointer } type itab struct { inter * interfacetype _type * _type link * itab hash

Golang面试题

孤者浪人 提交于 2019-12-04 04:02:46
[TOC] Golang面试题 所有题目,一行一行敲过亲自验证后.100%没有问题. 这一套题最棒的地方在于可以学习到很多书上没有的东西,不光是在准备面试,同时也有很多应用非常巧妙的地方可以在工作中借鉴. 这一套题是我在一个PDF上看到的, PDF名称<Golang语言社区-04141153.pdf>. 1. defer的执行顺序 package main import "fmt" func main() { deferCall() } func deferCall() { defer func() { fmt.Println("前") }() defer func() { fmt.Println("中") }() defer func() { fmt.Println("后") }() panic("触发异常") /** 执行结果 后 中 前 panic: 触发异常 考点:defer执行顺序 解答: defer 是后进先出。 panic 需要等defer 结束后才会向上传递。 出现panic恐慌时候,会先按照defer的后入先出的顺序执行,最后才 会执行panic。 */ } for循环时使用指针赋值为副本形式 package main import "fmt" type person struct { Name string Age int } func pasePerson()