Golang
文章平均质量分 81
go学习总结
anssummer
只求每天进步一点点.
展开
-
好文收藏-深度学习
string和[]byte的对比何为string?什么是字符串?标准库builtin的解释:type stringstring is the set of all strings of 8-bit bytes, conventionally but not necessarily representing UTF-8-encoded text. A string may be empty, but not nil. Values of string type are immutable..原创 2021-08-15 15:36:41 · 113 阅读 · 0 评论 -
go性能优化
常规手段1.sync.Pool临时对象池应该是对可读性影响最小且优化效果显著的手段。最典型的就是fasthttp了,它几乎把所有的对象都用sync.Pool维护。但这样的复用不一定全是合理的。比如在fasthttp中,传递上下文相关信息的RequestCtx就是用sync.Pool维护的,这就导致了你不能把它传递给其他的goroutine。如果要在fasthttp中实现类似接受请求->异步处理的逻辑,必须得拷贝一份RequestCtx再传递。这对不熟悉fasthttp原理的使用者来讲,很容原创 2021-08-15 14:44:38 · 941 阅读 · 0 评论 -
golang lockfree
Lock-free 算法的基础是 CAS (Compareand-Swap) 原子操作。当某个地址的原始值等于某个比较值时,把值改成新值,无论有否修改,返回这个地址的原始值。目前的cpu 支持最多64位的CAS。并且指针 p 必须对齐。注:原子操作指一个cpu时钟周期内就可以完成的操作,不会被其他线程干扰。一般的 CAS 使用方式是:假设有指针 p, 它指向一个 32 位或者64位数,复制p 的内容(*p)到比较量 cmp (原子操作)基于这个比较量计算一个新值 xchg (非原子操作.原创 2021-08-15 13:08:24 · 519 阅读 · 0 评论 -
go调度
多进程、多线程已经提高了系统的并发能力,但是在当今互联网高并发场景下,为每个任务都创建一个线程是不现实的,因为会消耗大量的内存(每个线程的内存占用级别为MB),线程多了之后调度也会消耗大量的CPU。伟大的程序员们有开始想了,如何才能充分利用CPU、内存等资源的情况下,实现更高的并发?既然线程的资源占用、调度在高并发的情况下,依然是比较大的,是否有一种东西,更加轻量?你可能知道:线程分为内核态线程和用户态线程,用户态线程需要绑定内核态线程,CPU并不能感知用户态线程的存在,它只知道它在运行1个线程,这原创 2020-10-09 14:46:37 · 604 阅读 · 0 评论 -
Go 为什么这么“快”
从概念上讲,并发和并行是不同的, 简单来说看这个图片package mainimport "fmt"import "time"var quit chan intfunc foo(id int) { fmt.Println(id) time.Sleep(time.Second) // 停顿一秒 quit <- 0 // 发消息:我执行完啦!} func main() { count := 1000 quit = make(chan int.转载 2020-10-09 14:06:19 · 173 阅读 · 0 评论 -
golang channel详解
channel内部原理数据结构type hchan struct {qcount uint // 所有在队列中数据数量dataqsiz uint // 环形队列大小,可以存放的元素个数buf unsafe.Pointer // 只想环形队列的指针elemsize uint16closed uint32elemtype *_type // element typesendx uint // 生产下标recvx原创 2020-09-10 17:34:31 · 517 阅读 · 0 评论 -
golang中sync.Map并发创建、读取问题实战记录
背景:我们有一个用go做的项目,其中用到了zmq4进行通信,一个简单的rpc过程,早期远端是使用一个map去做ip和具体socket的映射。问题大概是这样 1 2 3 4 struct SocketMap { sync.Mutex sockets map[string]*zmq4.Socket } ...原创 2020-03-13 00:13:38 · 269 阅读 · 0 评论 -
go常用命令
1.go官方网站: godoc -http ':8989'2.一般并发的bug 有两种,死锁(block)和 竞争(race)死锁发生时,go run 会直接报错race 发生时,要加race 才会在运行时报warning,go run xxx.go 后面加上 -race 参数3.profile 分析pprof有两个包用来分析程序一个是net/http/pprof另一个是runt...原创 2020-01-03 00:35:56 · 245 阅读 · 0 评论 -
goroutine 调度原理
go routine 调度一、goroutine 简介goroutine 本质是协程,并行计算的核心。goroutine使用方式非常简单,只需要go关键字即可启动一个协程,并且它是处于异步方式执行,并不需要等他运行完成以后在执行以后的代码二、 go routine 内部原理概念介绍在进行原理之前,先了解关键术语的概念并发一个cpu上面能同时执行多项任务,在短时间内,cpu来...原创 2019-12-05 23:55:14 · 731 阅读 · 0 评论 -
Goalng内存逃逸
无GC语言是怎么运作的一般来说,类似C/C++语言通过 malloc等方法分配的内存是在heap上的,但在Golang中却不是这样的,即便使用 new,也不一定分配在heap上,这也是我们今天要关注的问题。那么为什么Go会这样呢?其实也很简单,因为Go是有runtime的,实际分配在heap还是stack是由runtime决定的。看到这里可能会很奇怪,为什么有runtime,有GC我们...原创 2019-12-05 15:42:05 · 300 阅读 · 0 评论 -
Golang之平滑重启服务
与重载配置相同的是我们也需要通过信号来通知server重启,但关键在于平滑重启,如果只是简单的重启,只需要kill掉,然后再拉起即可。平滑重启意味着server升级的时候可以不用停止业务。我们先来看下Github上有没有相应的库解决这个问题,然后找到了如下三个库:facebookgo/grace- Graceful restart & zero downtime deploy f...转载 2019-11-17 15:05:17 · 1479 阅读 · 0 评论 -
Golang配置处理-TOML
配置工具的选择但我们又遇到了一个问题,一个项目通常是有很多配置的,比如PHP的php.ini文件、Nginx的server.conf文件,那么Golang的项目又适合使用怎样的配置文件呢?其实现在我们有很多选择,比如 JSON文件、INI文件、YAML文件和TOML文件等等。其中这些文件,对应的Golang处理库如下:encoding/json-- 标准库中的包,可以处理JSON...原创 2019-11-17 15:01:26 · 1077 阅读 · 0 评论