Golang
文章平均质量分 92
Golang相关知识
Kylin_Mountain
A golang programer.
展开
-
GopherChina 2020 Go Programming Patterns 学习笔记篇2
本篇继续学习左耳朵耗子老师的Go Programming Patterns下半部分,PPT太长了,70多页。Topic 10 函数化的选项配置由于Golang不允许使用同一个名字来命名函数,必须是不同的名称,即使参数不同,这与Java不一样,java的方法签名是包含参数的。所以遇到那种多个参数来实例化一个变量的,就会比较麻烦。会有类似代码产生:type Server struct { Addr string Port int Protocol string Timeout time.Dura原创 2020-12-09 18:22:00 · 294 阅读 · 0 评论 -
GopherChina 2020 Go Programming Patterns 学习笔记篇1
今天学习的是左耳朵耗子老师的 Go Programming PatternsTopic 1 Slice我们知道Slice是一个结构体type SliceHeader struct { Data uintptr Len int Cap int}一个var a []int 是nil,但是它的len和cap都将是零,因为值是初始化这个slice结构体的零值,即SliceHeader{ Data: nil, Len: 0, Cap: 0,}PPT里讨论的是slice的共享内存,在原创 2020-11-27 16:15:13 · 376 阅读 · 0 评论 -
Golang 基本类型字符串、数组和Slice
字符串String字符串的底层表示type StringHeader struct { Data uintptr Len int}Data 指向底层的字符数组Len 表示字符串的长度Go语言中,所有的文件都采用UTF-8编码,字符常量也是用的是UTF-8字符编码集。UTF-8 是可变长的编码方式,比如ASCII码 就用一个字节表示,中文就是3个字节表示。我记得ASCII的UTF-8编码是最高位为0。使用range 轮询字符串,所出来的是utf-8编码的符文rune。比如"Hello你原创 2020-08-12 13:43:29 · 625 阅读 · 0 评论 -
Golang 逃逸分析
以下摘自https://studygolang.com/articles/21788和https://zhuanlan.zhihu.com/p/91559562,仅做笔记使用。1. 为什么要做逃逸分析我们提到go语言中对象内存的分配不是由语言运算符或函数决定,而是通过逃逸分析来决定。为什么要这么干呢?其实说到底还是为了优化程序。如果分配到栈上,待函数返回资源就被回收了如果分配到堆上,函数返回后交给gc来管理该对象资源,栈资源的分配及回收速度比堆要快,所以逃逸分析最大的好处应该是减少了GC的压力。原创 2020-08-12 13:38:28 · 355 阅读 · 0 评论 -
Golang 深入浅出map
网上很多博客都对map的内部实现讲了很多,很多人可能看完都绕晕了,看完可能装载因子是多少,扩容倍率是多少还是没搞清楚。没错我就是这样子,QAQ。直接给出结果,装载因子6.5,扩容倍率是2倍,采用拉链法。这个拉链法并不是传统意义上的数组加链表,而是数组桶加数组的形式。接下来我们一步一步简单说明好了。map的创建,一般是通过make来初始化的,编译时会将make替换为如下的runtime makemap。可以看到,它返回的是一个叫做hmap的指针,这也是为何说map是一个指针,所以参数传递放心大胆的传,内部原创 2020-08-11 00:03:43 · 720 阅读 · 2 评论 -
Go语言中Goroutine如何退出
在Go语言中,启动一个协程Goroutine很方便,一行代码的事儿,比如go runTask()。但是如果runTask要在运行中途退出呢?有人说用channel,那么如何在web请求中,每次拿到那个channel呢?没写过的人,一时半会还真想不清楚。我们在web请求中,启动了一个goroutine来运行某个任务,就像这样 go runTask()。它的内部是一个for循环,循环获取数据,同时检查任务的运行状态。如果不再是运行状态了,就可以退出了。如果我们的流程是这样的,启动任务A,假设它跑在gorou原创 2020-07-23 19:16:21 · 1566 阅读 · 0 评论 -
记一次Go程序CPU占用100%的问题
我写的一个服务,有段时间CPU占用一直是100%。因为一直在开发环境,还没上线,今天终于有时间了就排查了一下。100%这种占用,一看就感觉是某个for循环导致的。首先,选择分析工具,Golang的性能分析工具pprof。在Gin这个框架中,需要通过注册才可以使用。方式if ok, _ := strconv.ParseBool(utils.GetEnv("DEVELOP_MODE")); ok { pprof.Register(router)}我们用了一个环境变量DEVELOP_MODE来控原创 2020-06-19 19:14:59 · 6606 阅读 · 0 评论