golang
墨尔本--晴
这个作者很懒,什么都没留下…
展开
-
论go语言中goroutine的使用
go中的goroutine是go语言在语言级别支持并发的一种特性。初接触go的时候对go的goroutine的欢喜至极,实现并发简便到简直bt的地步。但是在项目过程中,越来越发现goroutine是一个很容易被大家滥用的东西。goroutine是一把双面刃。这里列举一下goroutine使用的几宗罪:1 goroutine的指针传递是不安全的12345678fun main() { requ...转载 2018-04-15 13:11:03 · 224 阅读 · 0 评论 -
golang 单元测试进阶篇
本文档说明 go 语言自带的测试框架未提供或者未方便地提供的测试方案,主要是用于解决写单元测试中比较头痛的依赖问题。也就是伪造模式,经典的伪造模式有桩对象( stub ),模拟对象( mock )和伪对象( fake )。比较幸运的是,社区有丰富的第三方测试框架支持支持。下面就对笔者亲身试用并实践到项目中的几个框架做介绍:1.gomock文档地址:package gomockgomoc...转载 2019-01-09 14:49:07 · 2245 阅读 · 0 评论 -
Golang GC算法解读
概括Go的垃圾回收官方形容为 非分代 非紧缩 写屏障 三色并发标记清理算法。非分代:不像Java那样分为年轻代和年老代,自然也没有minor gc和maj o gc的区别。非紧缩:在垃圾回收之后不会进行内存整理以清除内存碎片。写屏障:在并发标记的过程中,如果应用程序(mutator)修改了对象图,就可能出现标记遗漏的可能,写屏障就是为了处理标记遗漏的问题。三色:将GC中的对象按照搜索的情况分成...转载 2019-01-04 14:37:49 · 2229 阅读 · 0 评论 -
gRPC服务发现&负载均衡
构建高可用、高性能的通信服务,通常采用服务注册与发现、负载均衡和容错处理等机制实现。根据负载均衡实现所在的位置不同,通常可分为以下三种解决方案:1、集中式LB(Proxy Model)在服务消费者和服务提供者之间有一个独立的LB,通常是专门的硬件设备如 F5,或者基于软件如 LVS,HAproxy等实现。LB上有所有服务的地址映射表,通常由运维配置注册,当服务消费方调用某个目标服务...转载 2018-11-23 11:56:13 · 353 阅读 · 0 评论 -
Go语言 map的实现
Go中的map在底层是用哈希表实现的,你可以在 $GOROOT/src/pkg/runtime/hashmap.goc 找到它的实现。数据结构哈希表的数据结构中一些关键的域如下所示:struct Hmap{ uint8 B; // 可以容纳2^B个项 uint16 bucketsize; // 每个桶的大小 byte *buckets...转载 2018-11-02 11:14:36 · 182 阅读 · 0 评论 -
Golang 中关于闭包的坑
所谓闭包是指内层函数引用了外层函数中的变量或称为引用了自由变量的函数,其返回值也是一个函数,了解过的语言中有闭包概念的像 js,python,golang 都类似这样。python 中的闭包可以嵌套函数,像下面这样:def make_adder(addend): def adder(augend): return augend + addend return add...转载 2018-07-03 11:22:49 · 1917 阅读 · 0 评论 -
Golang开发新手常犯的50个错误
《50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs》原文地址:http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/index.html一、初级1、不允许左大括号单独一行2、不允许出现未使用的变量3、不允许出现未使用...转载 2018-06-20 10:50:45 · 461 阅读 · 0 评论 -
golang线程同步WaitGroup简介
WaitGroup用于线程同步,WaitGroup等待一组线程集合完成,才会继续向下执行。 主线程(goroutine)调用Add来设置等待的线程(goroutine)数量。 然后每个线程(goroutine)运行,并在完成后调用Done。 同时,Wait用来阻塞,直到所有线程(goroutine)完成才会向下执行。对官方的代码做简单修改:package main import ( ...转载 2018-06-01 12:04:17 · 279 阅读 · 0 评论 -
Go语言的方法接受者类型用值类型还是指针类型?
概述很多人(特别是新手)在写 Go 语言代码时经常会问一个问题,那就是一个方法的接受者类型到底应该是值类型还是指针类型呢,Go 的 wiki 上对这点做了很好的解释,我来翻译一下。何时使用值类型1.如果接受者是一个 map,func 或者 chan,使用值类型(因为它们本身就是引用类型)。2.如果接受者是一个 slice,并且方法不执行 reslice 操作,也不重新分配内存给 slice,使用值...转载 2018-05-31 20:19:46 · 182 阅读 · 0 评论 -
http.ServeMux解析
web server概述使用go语言搭建一个web服务器是很简单的,几行代码就可以搭建一个稳定的高并发的web server。// hello world, the web serverfunc HelloServer(w http.ResponseWriter, req *http.Request) { io.WriteString(w, "hello, world!\n")}func m...转载 2018-04-12 11:29:56 · 2545 阅读 · 0 评论 -
解决 "DOES NOT SUPPORT INDEXING" ERROR IN A GO PROGRAM
如果你正在读这篇文章时候,很有可能你是在谷歌怎么解决这个问题:你在函数体里面传递一个指针给一个slice或者map,当你通过*variable[0]获取其中item值时候,就会报这个错:“does not support indexing” error如果解决呢?方式非常简单,不要使用:*variable[0]而是使用(*variable)[0]为什么会出现这么奇怪的错误呢?Go...翻译 2019-01-22 15:07:46 · 4431 阅读 · 0 评论