golang

GOlang服务器使用CapnProto, Protobuf, RapidJson, SBE, FlatterBuff协议调研比较以及最后选择。

匿名 (未验证) 提交于 2019-12-03 00:18:01
1.先排除RapidJson. 2. 参看 CapnProto官方给出的图 给出的解释是SBE,FlatterBuff,和CapnProto相对于ProtoBuf最大的优点是0拷贝(不需要编码和解码过程)。 FlatterBuf和CapnProto采用随机存取。 SBE没有自己的SchemeLanguage采用XML,格式不美观。 3.过滤掉SBE后,发现CapnProto对Go的支持太弱,都是2015年可以跑的代码。现在跑不起来,要手动修改配置和代码搭建环境。 4.同样参考上图,CapnProto说这些序列化库的作者刚偏向于库的使用方向,FlatterBuff是游戏。 5.至此花了8小时选择FlatterBuff昨晚Golang游戏服务器的协议。Period. 文章来源: GOlang服务器使用CapnProto, Protobuf, RapidJson, SBE, FlatterBuff协议调研比较以及最后选择。

golang字符串常用的系统函数

匿名 (未验证) 提交于 2019-12-03 00:17:01
1.统计字符串的长度,按字节len(str)   str := "hello北京"   fmt.Println("str len=", len(str)) 2.字符串遍历,同时处理有中文的问题 r := []rune(str) str2 := "hello北京" r := []rune(str2) for i := 1; i < len(r); i++ { fmt.Printf("字符=%c\n", r[i]) }    n, err := strconv.Atoi("5656") if err != nil{ fmt.Println("转换错误", err) }else { fmt.Println("转成的结果是", n) } 4.整数转字符串 str = strconv.Itoa(12345) str = strconv.Itoa(123456) fmt.Printf("str=%v, str=%T", str, str) 5.字符串转 []byte: var bytes = []byte("hello go") var bytes = []byte("hello go") fmt.Printf("bytes=%v\n", bytes) str = string([]byte{97, 98, 99}) fmt.Printf("str=%v\n", str) str :=

golang长连接和短连接的学习

匿名 (未验证) 提交于 2019-12-03 00:13:02
TCP连接示意图 长连接和短链接的区别 客户端和服务端响应的次数 长连接:可以多次。 短链接:一次。 传输数据的方式 长连接:连接--数据传输--保持连接 短连接:连接--数据传输--关闭连接 长连接和短链接的优缺点 长连接 优点 省去较多的TCP建立和关闭的操作,从而节约时间。 性能比较好。(因为客户端一直和服务端保持联系) 缺点 当客户端越来越多的时候,会让将服务器压垮。 连接管理难。 安全性差。(因为会一直保持着连接,可能会有些无良的客户端,随意发送数据等) 短链接 优点 服务管理简单。存在的连接都是有效连接 缺点 请求频繁,在TCP的建立和关闭操作上浪费时间 长连接和短连接使用情况举例 长连接 微信/qq 一些游戏 短连接 普通的web网站 golang实现长连接参考代码(实现群聊天) server.go package main import( "fmt" "net" "bufio" "errors" ) var connSlice []*net.TCPConn // 创建TCP长连接服务 func createTcp(){ tcpAdd,err:= net.ResolveTCPAddr("tcp","127.0.0.1:9999") //解析tcp服务 if err!=nil{ fmt.Println("net.ResolveTCPAddr error:",err)

golang的server push

匿名 (未验证) 提交于 2019-12-03 00:13:02
server push作用的理解 客户端和服务端建立连接之后,服务器主动将一些资源推送给服务端。 注意:推送的内容,要放在发送响应数据之前。 server push示意图 server push特点 理论上,缩短数据加载的时间 将请求数据存放在缓存中 server push是http2的产物 http2是强制性使用TLS(传送安全层)的,也就是https请求。因此为了完成代码,我们需要一个密钥(key)和一个证书(crt)。产生证书的方法。在Linux中运行以下命令(在当前路径下生成): openssl req - newkey rsa : 2048 - nodes - keyout server . key - x509 - days 365 - out server . crt 实现代码 参考代码 package main import ( "os" "fmt" "log" "net/http" "io/ioutil" "encoding/base64" ) var base64img string var image [] byte func init (){ var err error image , err = ioutil . ReadFile ( "./7775.jpg" ) if err != nil { fmt . Println ( "初始化读取文件错误" )

golang 性能剖析pprof

匿名 (未验证) 提交于 2019-12-03 00:11:01
作为一个golang coder,使用golang编写代码是基本的要求。 能够写出代码,并能够熟悉程序执行过程中各方面的性能指标,则是更上一层楼。 如果在程序出现性能问题的时候,可以快速定位和解决问题,那么写起代码来,会更加自信。 本文介绍的pprof,是golang 自带性能剖析工具,可以帮助定位程序中可能存在的问题。 例子代码如下: package main import ( "log" _ "net/http/pprof" "net/http" "time" ) func main() { go func() { log.Println(http.ListenAndServe("localhost:6060", nil)) }() go worker() select{} } // simple worker func worker(){ strSlice := []string{} for { str := "hello world " strSlice = append(strSlice, str) time.Sleep(time.Second) } } 代码开始引入 net/http/pprof ,在端口6060启动http服务。 启动应用程序 go build simple.go ./simpe 使用heap profile查看内存使用情况。 go tool

详解golang net之TCP底层

匿名 (未验证) 提交于 2019-12-03 00:09:02
golang版本1.12.9;操作系统:readhat 7.4 golang的底层使用epoll来实现IO复用。netPoll将文件描述符与底层进行了绑定。netpoll实现了用户的与底层网络IO相关的goroutine阻塞/非阻塞管理。 对netpoll的介绍按照这篇 文章 的思路按照tcp建链中的listen/accept/read/write/close动作详解过程。 下面以TCP为例完整解析TCP的建链/断链以及读写过程 listen流程: ListenTCP --> listenTCP --> internetSocket --> socket --> listenStream unix的listen函数用于将一个socket转换为监听socket。golang中同时结合了创建socket的步骤。 // src/net/tcpsock.gofunc ListenTCP(network string, laddr *TCPAddr) (*TCPListener, error) { switch network { //支持tcp协议为”tcp4“和“tcp6”,当使用"tcp"时可以通过地址格式进行判断 case "tcp", "tcp4", "tcp6": default: return nil, &OpError{Op: "listen", Net: network,

golang可执行文件瘦身(缩小文件大小)

匿名 (未验证) 提交于 2019-12-03 00:08:02
golang部署起来极其遍历,但有时候希望对可执行文件进行瘦身(缩小文件大小) 情况允许情况下,交叉编译为32位 删除不必要的符号表、调试信息 尝试用对应平台的 upx 打压缩壳 经过多次尝试,确定如下步骤效果最好(以windows 10下环境为例) package main import ( "fmt" ) func main() { fmt.Println("Hello World!") } 修改GO环境变量为 win32(可选) GOROOT=c:\go GOARCH=386 GOOS=windows 编译无符号表和调试信息的可执行文件 go build -ldflags "-s -w" 调用 upx 压缩 .\upx.exe -9 .\HiGo.exe 处理前:64位=>1.97M 32位=>1.75M 处理后:64位=> 504K 32位=>479K 来源:博客园 作者: wuyaSama 链接:https://www.cnblogs.com/wuyaSama/p/11535382.html

golang正则表达式

匿名 (未验证) 提交于 2019-12-03 00:08:02
/* go正则表达式 go内置了对正则表达式的支持 这里正则表达式常规用法例子 */ package main import ( "bytes" "fmt" "regexp" ) func main() { /* 测试模式是否匹配字符串 */ match, _ := regexp.MatchString("p([a-z]+)ch", "peach") fmt.Println(match) r, _ := regexp.Compile("p([a-z]+)ch") r.MatchString("peach") //这个方法检测字符串是否存在正则所约束的匹配 r.FindString("peach punch") r.FindStringIndex("peach punch") r.FindAllString("peach punch pinch", -1) r.Match([]byte("peach")) r = regexp.MustCompile("p([a-z]+)ch") r.ReplaceAllString("a peach", "<fruit>") in := []byte("a peach") out := r.ReplaceAllFunc(in, bytes.ToUpper) } 来源:51CTO 作者: boshuzhang 链接:https://blog.csdn

golang时间戳

匿名 (未验证) 提交于 2019-12-03 00:08:02
/* go时间戳 程序的一个通常需求是 计算从unix起始时间开始 到某个时刻的秒数 毫秒数 微妙数 */ package main import ( "fmt" "time" ) func main() { /* 使用unix UnixNano 来分别获取从Unix起始时间到现在所经过的秒数和微妙数 */ now := time.Now() secs := now.Unix() nanos := now.UnixNano() fmt.Println(now) millis := nanos / 1000000 time.Unix(secs, 0) time.Unix(0, nanos) } 来源:51CTO 作者: boshuzhang 链接:https://blog.csdn.net/boshuzhang/article/details/100916027

golang append

匿名 (未验证) 提交于 2019-12-03 00:06:01
1. 优点:append可以对nil的slice进行操作 2.基本用法 创建s时,cap(s) == 1,内存中数据[5] append(s, 7) 时,按Slice扩容机制,cap(s)翻倍 == 2,内存中数据[5,7] append(s, 9) 时,按Slice扩容机制,cap(s)再翻倍 == 4,内存中数据[5,7,9],但是实际内存块容量4 x := append(s, 11) 时,容量足够不需要扩容,内存中数据[5,7,9,11] y := append(s, 12) 时,容量足够不需要扩容,内存中数据[5,7,9,12] 3. 小坑 package main import ( "fmt" ) func main() { var s = make([]string, 10) s = append(s, "aaa") fmt.Printf("s[0]=[%s]\n", s[0]) for i, v := range s { fmt.Printf("s[%d]=[%s]\n", i, v) } } $ go build && ./main s[0]=[] s[0]=[] s[1]=[] s[2]=[] s[3]=[] s[4]=[] s[5]=[] s[6]=[] s[7]=[] s[8]=[] s[9]=[] s[10]=[aaa] 未完待续。。。 来源:51CTO