GO
chenchongswjtu
游戏服务器开发,后端开发
展开
-
【golang】逃逸分析
写过C/C++的同学都知道,调用著名的malloc和new函数可以在堆上分配一块内存,这块内存的使用和销毁的责任都在程序员。一不小心,就会发生内存泄露,搞得胆战心惊。切换到Golang后,基本不会担心内存泄露了。虽然也有new函数,但是使用new函数得到的内存不一定就在堆上。堆和栈的区别对程序员“模糊化”了,当然这一切都是Go编译器在背后帮我们完成的。一个变量是在堆上分配,还是在栈上分配,...转载 2019-03-04 13:59:19 · 1431 阅读 · 1 评论 -
【golang】垃圾回收机制
常见 GC 算法趁着这个机会我总结了一下常见的 GC 算法。分别是:引用计数法、Mark-Sweep法、三色标记法、分代收集法。1. 引用计数法原理是在每个对象内部维护一个整数值,叫做这个对象的引用计数,当对象被引用时引用计数加一,当对象不被引用时引用计数减一。当引用计数为 0 时,自动销毁对象。目前引用计数法主要用在 c++ 标准库的 std::shared_ptr 、微软的 C...转载 2019-02-01 17:29:45 · 159 阅读 · 0 评论 -
【golang】每隔几分钟执行一个函数可以这样做
使用定时器 使用这种方式 go function()func function() { // TODO 具体逻辑 // 每5分钟执行一次 time.AfterFunc(5*time.Minute, function)}原创 2019-02-01 14:42:02 · 10147 阅读 · 5 评论 -
【golang】中代码"0123456789ABCDEF"[0]
表达式”0123456789ABCDEF”[0]是一个常用的技巧,它可以快速将一个数字转换为16进制字符。”0123456789ABCDEF”是一个字符串字面量,类型是char[17](在C中)或者const char[17](在C++中),转换后的指针类型分别为char*和const char*,因此”0123456789ABCDEF”[0]就是第0个元素’0’。这个技巧常常用在进制转换...转载 2019-02-01 10:37:14 · 1847 阅读 · 0 评论 -
go channel的用法总结
这篇文章总结了channel的10种常用操作,以一个更高的视角看待channel,会给大家带来对channel更全面的认识。在介绍10种操作前,先简要介绍下channel的使用场景、基本操作和注意事项。channel的使用场景把channel用在数据流动的地方:消息传递、消息过滤 信号广播 事件订阅与广播 请求、响应转发 任务分发 结果汇总 并发控制 同步与异步 ....转载 2019-01-22 09:44:46 · 6249 阅读 · 3 评论 -
golang并发
转载 2019-01-26 16:32:37 · 115 阅读 · 0 评论 -
golang 连接 mysql 数据库
connectStr := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", userName, pwd, dbIpAddr, dbName)其中 &parseTime=True&loc=Local 设置之后插入数据库的时间是local的时间不设置则是格林威治时...原创 2019-01-10 11:50:53 · 604 阅读 · 0 评论 -
go包管理之go1.11 go mod
go mod init如果出现下面的错误 go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules' 开启go module:set GO111MODULE=on //windowsexport GO111MODULE=on //linux1.新建文件夹 go_...原创 2019-01-09 20:48:06 · 3066 阅读 · 0 评论 -
golang map遍历随机的问题
map底层是hash表, 然后扩容缩容会发生rehash, 顺序会发生变化,但是没有扩缩容的时候,顺序是有保证的,但是golang为了让程序员不依赖这种不可靠的保证,就干脆遍历的时候加入随机数,然后不管什么时候遍历,顺序都是不保证的...转载 2019-01-28 14:32:39 · 1989 阅读 · 0 评论 -
go如何获取系统层面的信息 go如何获取系统层面的信息吗,像top命令那样的。尽量不要调用shell获取
https://github.com/shirou/gopsutil转载 2019-01-23 10:03:48 · 1185 阅读 · 0 评论 -
Golang Context分析
Context背景 和 适用场景golang在1.6.2的时候还没有自己的context,在1.7的版本中就把golang.org/x/net/context包被加入到了官方的库中。golang 的 Context包,是专门用来简化对于处理单个请求的多个goroutine之间与请求域的数据、取消信号、截止时间等相关操作,这些操作可能涉及多个 API 调用。比如有一个网络请求Request,...转载 2019-01-28 20:02:25 · 395 阅读 · 0 评论 -
【golang】获取本机IP和外网IP
获取本机IP// 获取本机网卡IPfunc getLocalIP() (ipv4 string, err error) { var ( addrs []net.Addr addr net.Addr ipNet *net.IPNet // IP地址 isIpNet bool ) // 获取所有网卡 if addrs, err = net.Interfa...原创 2019-03-14 10:20:15 · 7260 阅读 · 0 评论 -
【golang】方法的结构指针接收者和结构值接收者
结构体(1)结构指针接收者,顾名思义,会在方法内部改变该结构内部变量的值; (2)结构值接收者,在方法内部对变量的改变不会影响该结构。 package mainimport "fmt"type My struct { num int}func (m My) AddOne() { m.num++}func (m *My) AddTwo() { m.num += ...转载 2019-02-14 15:06:15 · 310 阅读 · 0 评论 -
Go线程实现模型MPG
M指的是Machine,一个M直接关联了一个内核线程。由操作系统管理。 P指的是”processor”,代表了M所需的上下文环境,也是处理用户级代码逻辑的处理器。它负责衔接M和G的调度上下文,将等待执行的G与M对接。 G指的是Goroutine,其实本质上也是一种轻量级的线程。包括了调用栈,重要的调度信息,例如channel等。P的数量由环境变量中的GOMAXPROCS决定,通常来说它是和核心...转载 2019-02-18 11:00:00 · 1832 阅读 · 2 评论 -
【golang】go-echarts可视化的第三方库
在 Golang 这门语言中,目前数据可视化的第三方库还是特别少,go-echarts 的开发就是为了填补这部分的空隙。Echarts 是百度开源的非常优秀的可视化图表库,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。也有其他语言为其实现了相应语言版本的接口,如 Python 的 pyecharts,go-echarts 也是借鉴了 pyecharts 的一些设计思想。http:...转载 2019-02-11 09:50:53 · 3252 阅读 · 0 评论 -
golang: 详解interface和nil
package mainimport ( "fmt" "reflect")type People interface { Show()}type Student struct{}func (stu *Student) Show() {}func live() People { var stu *Student return stu}func main() ...原创 2019-01-30 18:09:42 · 347 阅读 · 0 评论 -
golang在遍历slice中的坑
package mainimport "fmt"func main() { pase_student()}type student struct { Name string Age int}func pase_student() { m := make(map[string]*student) stus := []student{ {Name: "zhou",...原创 2019-01-30 16:10:35 · 8720 阅读 · 0 评论 -
golang排序
golang归并排序 package mainimport "fmt"func main() { a := []int{8, 6, 5, 4, 3, 2, 1} mergeSort(a, 0, len(a)-1) fmt.Println(a)}func mergeSort(a []int, l, r int) { if l >= r { // 必须要有=,只有一个...原创 2019-01-30 10:14:03 · 296 阅读 · 0 评论 -
golang的CSP并发模型中MPG关系
转载 2019-01-29 11:26:30 · 963 阅读 · 1 评论 -
【golang】channel总结
· 给一个 nil channel 发送数据,造成永远阻塞· 从一个 nil channel 接收数据,造成永远阻塞· 给一个已经关闭的 channel 发送数据,引起 panic· 从一个已经关闭的 channel 接收数据,立即返回一个零值...转载 2019-02-14 16:43:38 · 286 阅读 · 0 评论 -
用 golang 封装了一个 ip 地址库
最近在做一个 p2p 应用,有一个需求是想根据 peer 的物理距离选择最佳路由,貌似 ip 和距离没什么太直接的关系,搜索了一圈提供这种服务的大多是在线的 rpc ,又慢又有次数和频率限制,更过分的是还有收费的,哎!苦恼了一下午终于发现了救星 《geoip2-golang》 ,他们维护了一套ip地址库并且提供了模糊的坐标信息,经过一番简单的封装,可以在 golang 程序中非常容易的使用这些...转载 2019-01-09 14:21:02 · 1525 阅读 · 1 评论 -
OTP一次性动态密码工具实现
对于企业内部信息安全或行业安全合规性需求,3A认证、授权、审计是必要的基础安全审查项。认证安全机制要求双因素认证,从技术要可使用基于数字证书和OTP来实现满足。OTP分为两种技术算法HOTP(基于次数 RFC 4226)和TOTP(基于时间 RFC 6238)标准。而目前开源的Google Authenticator工具很好的实现了OTP移动端APP的使用与密钥管理。为了在企业运维安全加固需求...转载 2019-01-09 13:40:43 · 9522 阅读 · 0 评论 -
根路径总是被访问两次,都是favicon.ico惹出来的
在使用golang做web开发的时候,如果在根路径上直接输出内容,你会发现,你的访问总是被执行 2 次。根路径的 handler 是这个样子的func indexHandler(writer http.ResponseWriter, request *http.Request) { tms := time.Now().Format("2006-01-02 15:04:05.0000...转载 2019-01-09 11:26:55 · 5839 阅读 · 0 评论 -
go与ratelimit
背景限流是对资源访问进行控制,当访问超过承受范围的时候,我们就必须考虑限流来保证接口的可用性或者降级可用性。限流算法计数器法计数器法是限流算法里最简单也是最容易实现的一种算法。维护一个单位时间内的Counter,当单位时间已经过去则将Counter重置零。这个算法虽然简单,但是有一个十分致命的问题,那就是临界问题。在临界时间的前一毫秒和后一毫秒都触发了最大的请求数,就会在两毫秒内...转载 2018-12-29 17:30:05 · 4434 阅读 · 0 评论 -
grpc-go 连接backoff协议
原文链接:https://blog.keyboardman.me/2018/02/06/grpc-doc-with-grpc-connection-backoff/转载 2018-12-29 16:15:59 · 832 阅读 · 0 评论 -
Functional Options Patter--golang 函数参数选项配置
原文地址:https://blog.keyboardman.me/2018/01/03/grpc-functional-options-patter/转载 2018-12-29 15:57:25 · 375 阅读 · 0 评论 -
golang发送邮件以及附件
https://studygolang.com/articles/17287#reply0转载 2018-12-29 10:35:35 · 1348 阅读 · 0 评论 -
golang跳出for select 循环
通常在for循环中,使用break可以跳出循环,但是注意在go语言中,for select配合时,break并不能跳出循环。func testSelectFor(chExit chan bool){ for { select { case v, ok := <-chExit: if !ok { fmt.Println("close channel 1", v)...转载 2018-12-28 16:11:56 · 4246 阅读 · 1 评论 -
Golang并发:一招掌握无阻塞通道读写
介绍Golang并发的模型写了几篇了,但一直没有以channel为主题进行介绍,今天就给大家聊一聊channel,channel的基本使用非常简单,想必大家都已了解,所以直接来个进阶点的:介绍channel的阻塞情况,以及给你一个必杀技,立马解决阻塞问题,实用性高。阻塞场景无论是有缓存通道、无缓冲通道都存在阻塞的情况。阻塞场景共4个,有缓存和无缓冲各2个。无缓冲通道的特点是,发送的数据...转载 2018-12-28 11:48:05 · 576 阅读 · 0 评论 -
解决beego中同时开启http和https时,https端口占用问题
在beego的配置文件中app.conf配置HTTP和HTTPS的相关配置appname = ebsServerautorender = falsehttpport = 8094runmode = devEnableHTTPS=trueEnableHttpTLS = trueHttpsPort = 9092HTTPSCertFile = "server.crt"HTTPSKe...原创 2018-12-27 14:06:25 · 2581 阅读 · 0 评论 -
golang.org/x包无法下载
由于谷歌被墙,跟谷歌相关的模块无法通过go get来下载,解决方法git clone https://github.com/golang/net.git $GOPATH/src/github.com/golang/netgit clone https://github.com/golang/sys.git $GOPATH/src/github.com/golang/sysgit clon...转载 2018-12-27 13:57:24 · 2237 阅读 · 0 评论 -
go中的nil
go中的nil原文链接:https://blog.keyboardman.me/2018/05/12/nil-in-go/首先使用v, ok语法。当使用这个语法时,ok是一个布尔值,channel是开着的,它为true。这样可以避免将多余的零值发送给out。v, ok := <- c ...转载 2018-12-29 19:43:00 · 350 阅读 · 0 评论 -
GOLANG 连接Mysql的时区问题
使用mysql的时间字段遇到如下两个问题1.使用go-sql-driver来连接mysql数据库,获取的时区默认是UTC +0的,与本地的东八区是有区别,在业务处理中会出现问题2.获取mysql中的日期,是string类型,需要在代码中用time.Parse进行转化解决方案:在连接的dsn中,添加parseTime=true 和loc=Local,此处的local可以换为具体的时区(As...原创 2019-01-10 13:42:02 · 2957 阅读 · 1 评论 -
Go的并发设置
现象:Go语言最大的优势就在于写高并并发的程序,能很方便的利用goroutine来充分利用系统资源,但估计你用协程写出的第一个高并发程序都没有充分的利用起CPU。最多就跑个100%,这让我几十核的CPU情何以堪啊。分析:因为Go默认情况下只用单线程。这就是说,你即使开了几百个goroutine,系统中同一时间在跑的只有一个线程,也就是一个协程。那是因为没有设置并发度。runtim...转载 2019-01-14 17:26:28 · 1636 阅读 · 0 评论 -
Go语言的协程中,写死循环的注意点
Go语言的协程中,写死循环的注意点:现象:在写Go的多协程程序时,出现过几次无法理解的情况。有一次,我想写一个能跑满cpu的程序,最容易想到的就是,开几个Go的协程,每个协程里写死循环。没想到,运行的时候发现,协程就只开出了一个。 另一次,我写了个程序,也是开了多个协程。因为如果不阻塞住主函数,主函数一结束,程序就会结束。所以我就在主函数结束前加了个死循环。然后就发现整个协程都被卡住...转载 2019-01-14 17:24:29 · 7136 阅读 · 0 评论 -
golang CSP并发模型
图中 M:是内核线程 P : 是调度协调,用于协调M和G的执行,内核线程只有拿到了 P才能对goroutine继续调度执行,一般都是通过限定P的个数来控制golang的并发度 G : 是待执行的goroutine,包含这个goroutine的栈空间 Gn : 灰色背景的Gn 是已经挂起的goroutine,它们被添加到了执行队列中,然后需要等待网络IO...转载 2019-01-14 10:41:28 · 1292 阅读 · 0 评论 -
golang slice
零切片就是其元素值都是元素类型的零值的切片。空切片就是数组指针不为nil,且 slice 的长度为0。nil切片就是引用底层数组指针为 nil 的 slice。操作上零切片、空切片和正常的切片都没有任何区别,但是nil切片会多两个特性,一个nil切片等于 nil值,且进行 json 序列化时其值为 null,nil切片还可以通过赋值为 nil 获得。...转载 2019-01-14 10:11:36 · 129 阅读 · 0 评论 -
golang web服务器返回状态码
服务器:package mainimport ( "net/http")func main() { http.HandleFunc("/", func (w http.ResponseWriter, r *http.Request){ w.Header().Set("name", "my name is smallsoup") w.WriteHeader(50...转载 2019-01-03 10:18:06 · 5903 阅读 · 0 评论 -
golang库积累
1 : go 二维码https://github.com/tuotoo/qrcode2: go excel 操作https://github.com/tealeg/xlsx3: golang 操作redishttps://github.com/garyburd/redigohttps://github.com/muesli/cache2govegamcache:Go实现...转载 2019-01-02 14:20:48 · 417 阅读 · 0 评论 -
go数据结构
链接:https://github.com/emirpasic/godsGoDS (Go Data Structures). Containers (Sets, Lists, Stacks, Maps, Trees), Sets (HashSet, TreeSet, LinkedHashSet), Lists (ArrayList, SinglyLinkedList, DoublyLinke...转载 2019-01-17 10:50:49 · 506 阅读 · 0 评论