Goroutine陷阱
摘要:Go在语言层面通过Goroutine与channel来支持并发编程,使并发编程看似变得异常简单,但通过最近一段时间的编码,越来越觉得简单的东西,很容易会被滥用。Java的标准库也让多线程编程变得简单,但想当初在公司定位Java的问题,发现很多的同学由于没有深入了解Java Thread的机制,Thr
阅读全文
golang 1.8 优雅关闭
摘要:// main.go package main import ( "fmt" "log" "net/http" "os" "os/signal" "syscall" "time" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Re...
阅读全文
Go性能优化小结
摘要:1 内存优化 1.1 小对象合并成结构体一次分配,减少内存分配次数 做过C/C++的同学可能知道,小对象在堆上频繁地申请释放,会造成内存碎片(有的叫空洞),导致分配大的对象时无法申请到连续的内存空间,一般建议是采用内存池。Go runtime底层也采用内存池,但每个span大小为4k,同时维护一个c
阅读全文
理解Go Context机制
摘要:1 什么是Context 最近在公司分析gRPC源码,proto文件生成的代码,接口函数第一个参数统一是ctx context.Context接口,公司不少同事都不了解这样设计的出发点是什么,其实我也不了解其背后的原理。今天趁着妮妲台风妹子正面登陆深圳,全市停工、停课、停业,在家休息找了一些资料研究
阅读全文
理解Go Interface
摘要:理解Go Interface1 概述Go语言中的接口很特别,而且提供了难以置信的一系列灵活性和抽象性。接口是一个自定义类型,它是一组方法的集合,要有方法为接口类型就被认为是该接口。从定义上来看,接口有两个特点:接口本质是一种自定义类型,因此不要将Go语言中的接口简单理解为C++/Java中的接口,后者仅用于声明方法签名。接口是一种特殊的自定义类型,其中没有数据成员,只有方法(也可以为空)。接口是完...
阅读全文
深入讨论channel timeout
摘要:深入讨论channel timeoutGo 语言的 channel 本身是不支持 timeout 的,所以一般实现 channel 的读写超时都采用 select,如下:select { case <-c: case <-time.After(time.Second): } 这两天在写码的过程中突然对这样实现 channel 超时产生了怀疑,这种方式真的好吗?于是我写了这样一个测试程序:packa...
阅读全文
fasthttp中的协程池实现
摘要:fasthttp中的协程池实现协程池可以控制并行度,复用协程。fasthttp 比 net/http 效率高很多倍的重要原因,就是利用了协程池。实现并不复杂,我们可以参考他的设计,写出高性能的应用。入口// server.go func (s *Server) Serve(ln net.Listener) error { var lastOverflowErrorTime time.Ti...
阅读全文
Golang 知识点总结
摘要:Golang 知识点总结目录 [−]各种类型复制的时候的花费可使用内建函数的类型 (len、cap、close、delete、make)内建容器类型的值比较组合类型T{...}的值比较零值是nil的类型编译时被执行的函数不能被寻址的值不支持比较的类型可命名的源代码元素命名的源代码元素可以使用 ()分组声明可以在函数内外声明的源代码元素可以返回一个可选bool返回值的表达式使用channel机制永远...
阅读全文
高级编码和解码技术
摘要:Go 的标准库包含了一些很不错的编码和解码包,里面涵盖了大量的编码方案。一切数据,不管是CSV,XML,JSON,还是 gob —— 一个 Go 特定的编码格式,都涵盖在内,并且,这些包都非常容易上手使用。 事实上,它们中的大多数都不需要再添加任何代码,你只需插入数据,它就会输出编码后的数据。不过,并不是所有的应用程序都乐于处理这种到 JSON 展现的一对一映射。Struct 标记可以涵盖一些场景...
阅读全文
go源文件中是否有main函数
摘要:import ( "go/parser""go/token" "go/ast" ) func HasMain(file string) (bool, error) { fset := token.NewFileSet() f, err := parser.ParseFile(fset, file, nil, 0)if err != nil {return fal...
阅读全文
golang 并发模式笔记
摘要:1、并发并不是并行,前者是优先对时间片的抢占,后者是真多核。 go中多线程时直接要求并行的方法是:亦不可滥用,CPU密集型,并发度很高的场景适用。 2、go起的协程 3、 function that returns a chanel fan-in 二次缓冲 send a chanel on a chanel 利用chanel饥饿阻塞原理实现有序 select 利用select的ok随机执行性,可以...
阅读全文
Golang 通用连接池库 Golang-Pool
摘要:Golang 实现的连接池功能:* 连接池中连接类型为interface{},使得更加通用* 链接的最大空闲时间,超时的链接将关闭丢弃,可避免空闲时链接自动失效问题* 使用channel处理池中的链接,高效基本用法//factory 创建连接的方法 factory := func() (interface{}, error) { return net.Dial("tcp", "127.0.0.1:...
阅读全文
如果裸写一个goroutine pool
摘要:引言在上文中,我说到golang的原生http server处理client的connection的时候,每个connection起一个goroutine,这是一个相当粗暴的方法。为了感受更深一点,我们来看一下go的源码。先定义一个最简单的http server如下。12345678func myHandler(w http.ResponseWriter, r *http.Request) { ...
阅读全文
fasthttp 的 goroutine pool 实现探究
摘要:引言fasthttp是一个非常优秀的web server框架,号称比官方的net/http快10倍以上。fasthttp用了很多黑魔法。俗话说,源码面前,了无秘密,我们今天通过源码来看一看她的goroutine pool的实现。热身fasthttp写server和原生的net/http写法上基本没有区别,这里就不举例子。直接找到入口函数,在根目录下的server.go文件中,我们从函数Listen...
阅读全文
golang实现权重轮询调度算法
摘要:package main import ( "fmt" "time" ) var slaveDns = map[int]map[string]interface{}{ 0: {"connectstring": "root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8", ...
阅读全文
获取本机ip
摘要:func GetLocalIP() { host, _ := os.Hostname() addrs, _ := net.LookupIP(host) for _, addr := range addrs { if ipv4 := addr.To4(); ipv4 != nil { fmt.Println("IPv4: ", ipv4) ...
阅读全文
golang学习资料
摘要:http://yougg.github.io/static/gonote/GolangStudy.html
阅读全文
dnscache --源码笔记
摘要://最新版本参见https://github.com/karlseguin/dnscache地址 或者 https://github.com/netroby/dnscache package dnscache// Package dnscache caches DNS lookupsimport ( "net" "sync" "time")//一个域名可能对应多个iptype Reso...
阅读全文
xsrftoken--源码笔记
摘要:// Package xsrftoken provides methods for generating and validating secure XSRF tokens.package xsrftoken // import "golang.org/x/net/xsrftoken"import ( "crypto/hmac" "crypto/sha1" "crypto/sub...
阅读全文
forwardport--源码笔记--注释
摘要:package mainimport ( "encoding/json" "flag" "fmt" "io" "log" "net" "net/http" "os" "os/signal" "runtime" "sync" "syscall" "time")var restApiServer = flag.String(...
阅读全文