Go语言中文网 为您找到相关结果 26

golang 仿python pack/unpack

写得不完善也不完美 尤其是高低位转换那(go和c 二进制高地位相反 需要转换,还有go int转[]byte长度是4位),希望牛人看后指导一下 项目需要通过socket调取 客户端是go ,服务器端是python,由于需要封包解包,就参照python写的 python 的pack/unpack 参考 Python使用struct处理二进制(pack和unpack用法) package includes import ( "bytes" "encoding/binary" "fmt" _ "os" "strconv" "strings" ) type Protocol struct { Format []string } //封包 func (p *Protocol) Pack(args .....阅读全文

博文 2015-04-08 04:00:00 wangxusummer

golang中tcp socket粘包问题和处理

在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格式是一个json格式的字符串: {"Id":1,"Name":"golang","Message":"message"} 当客户端发送数据给服务端的时候,如果服务端没有及时接收,客户端又发送了一条数据上来,这时候服务端才进行接收的话就会收到两个连续的字符串,形如: {"Id":1,"Name":"golang","Message":"message"}{"Id":1,"Name":"golang","Message":"message"} 如果接收缓冲区满了的话,那么也有可能接收到半截的json字符串,酱紫的话还怎么用json解码呢?真是头疼。以下用golang模拟了下这个粘包的产生。 备注...阅读全文

博文 2015-02-28 03:00:01 陈杰斌

Go学习笔记:json处理

Encode 将一个对象编码成JSON数据,接受一个interface{}对象,返回[]byte和error: func Marshal(v interface{}) ([]byte, error) Marshal函数将会递归遍历整个对象,依次按成员类型对这个对象进行编码,类型转换规则如下: bool类型 转换为JSON的Boolean 整数,浮点数等数值类型 转换为JSON的Number string 转换为JSON的字符串(带""引号) struct 转换为JSON的Object,再根据各个成员的类型递归打包 数组或切片 转换为JSON的Array []byte 会先进行base64编码然后转换为JSON字符串 map 转换为JSON的Object,key必须是string interf...阅读全文

博文 2016-02-12 22:00:02 qdx411324962

Go语言中Tcp协议粘包问题处理

在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格式是一个json格式的字符串: {"Id":1,"Name":"golang","Message":"message"} 当客户端发送数据给服务端的时候,如果服务端没有及时接收,客户端又发送了一条数据上来,这时候服务端才进行接收的话就会收到两个连续的字符串,形如: {"Id":1,"Name":"golang","Message":"message"}{"Id":1,"Name":"golang","Message":"message"} 如果接收缓冲区满了的话,那么也有可能接收到半截的json字符串,酱紫的话还怎么用json解码呢?真是头疼。以下用golang模拟了下这个粘包的产生。 备注...阅读全文

博文 2015-08-26 06:00:00 kenkao

golang 自定义封包协议(转的)

package protocol import ( "bytes" "encoding/binary" ) const ( ConstHeader = "jackluo" ConstHeaderLength = 7 ConstSaveDataLength = 4 ) //封包 func Packet(message []byte) []byte { return append(append([]byte(ConstHeader), IntToBytes(len(message))...), message...) } //解包 func Unpack(buffer []byte, readerChannel chan []byte) []byte { length := len(buffer...阅读全文

博文 2016-04-07 05:00:00 jackluo

在Go语言中使用JSON

Encode 将一个对象编码成JSON数据,接受一个interface{}对象,返回[]byte和error: func Marshal(v interface{}) ([]byte, error) Marshal函数将会递归遍历整个对象,依次按成员类型对这个对象进行编码,类型转换规则如下: bool类型 转换为JSON的Boolean 整数,浮点数等数值类型 转换为JSON的Number string 转换为JSON的字符串(带""引号) struct 转换为JSON的Object,再根据各个成员的类型递归打包 数组或切片 转换为JSON的Array []byte 会先进行base64编码然后转换为JSON字符串 map 转换为JSON的Object,key必须是string interf...阅读全文

博文 2015-06-17 23:02:23 tiaotiaoyly

记一次Golang routine卡死

Go语言最方便的地方在于可以自由自在的起routine,并且不用自己维护队列。 一个很简单的处理模型,针对于长连接活动平凡的链接独立routine进行处理,方便同一连接上下文关联,read routine A讲接收到的消息解包生成消息丢到对应socket的routine B channel中进行处理,routine B在根据不同的任务丢到对应的routine B1或者 routine B2中进行处理, 我们需要一个channel回写routine B1 routine B2的退出信号给你 B 以便B进行响应处理。 那么这么想的话 B 和B1 B2 需要两个channel进行消息通信 伪代码如下,未做友好处理。 var B1 B1Consumer var B2 B2Consumer //sta...阅读全文

博文 2016-04-21 03:00:03 hgd7123

开发者必备的swift技巧

不管是swift语言还是其他什么编程语言,如果我们在使用中,能掌握一部分小技巧的话,往往都能达到事半功倍的效果,今天和大家分享的就是swift开发中的一些小技巧,一起来看看吧。 通过Guard来验证方法   Swift的guard语句让代码更简洁、更安全。guard语句会检查一到多个情况,找出不符合else部分的调用。而else部分需要return,break,continue或throw语句来终止方法的执行,也就是说终止程序控制的执行。   我们使用guard语句来减少代码混乱,并避免在if/else语句中的嵌入。由于在guard语句的else部分中,代码必须转移程序控制的范围,如果出现无效的情况,简单地采用if语句来调用return语句更为安全。在编译时这些bug仍...阅读全文

SOS,困扰了一天多,怎么使用golang编写CRC16校验函数呢?

这些天要写一个通信协议封解包程序,要用到CRC16校验,协议中关于CRC的资料如下图: ![crc.JPG](http://studygolang.qiniudn.com/170210/294de19673a9adfae8391297bd2bf447.JPG) 我参考了一下别人用Java写的CRC16函数 public static String getCrc(byte[] data) { int high; int flag; int wcrc = 0xffff; for (int i = 0; i < data.length; i++) { high...阅读全文

golang中tcp socket粘包问题和处理

在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格式是一个json格式的字符串: {"Id":1,"Name":"golang","Message":"message"} 当客户端发送数据给服务端的时候,如果服务端没有及时接收,客户端又发送了一条数据上来,这时候服务端才进行接收的话就会收到两个连续的字符串,形如: {"Id":1,"Name":"golang","Message":"message"}{"Id":1,"Name":"golang","Message":"message"} 如果接收缓冲区满了的话,那么也有可能接收到半截的json字符串,酱紫的话还怎么用json解码呢?真是头疼。以下用golang模拟了下这个粘包的产生。 备注...阅读全文

博文 2015-10-11 11:02:32 陈杰斌

golang中tcp socket粘包问题和处理

在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格式是一个json格式的字符串: {"Id":1,"Name":"golang","Message":"message"} 当客户端发送数据给服务端的时候,如果服务端没有及时接收,客户端又发送了一条数据上来,这时候服务端才进行接收的话就会收到两个连续的字符串,形如: {"Id":1,"Name":"golang","Message":"message"}{"Id":1,"Name":"golang","Message":"message"} 如果接收缓冲区满了的话,那么也有可能接收到半截的json字符串,酱紫的话还怎么用json解码呢?真是头疼。以下用golang模拟了下这个粘包的产生。 备注...阅读全文

博文 2016-03-11 11:00:01 RyoHo2015

golang中tcp socket粘包问题和处理

自:http://www.01happy.com/golang-tcp-socket-adhere/ 在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格式是一个json格式的字符串: {"Id":1,"Name":"golang","Message":"message"} 当客户端发送数据给服务端的时候,如果服务端没有及时接收,客户端又发送了一条数据上来,这时候服务端才进行接收的话就会收到两个连续的字符串,形如: {"Id":1,"Name":"golang","Message":"message"}{"Id":1,"Name":"golang","Message":"message"} 如果接收缓冲区满了的话,那么也有可能接收到半截的js...阅读全文

博文 2016-01-31 15:00:01 wk890718

golang 解决 TCP 粘包问题

什么是 TCP 粘包问题以及为什么会产生 TCP 粘包,本文不加讨论。本文使用 golang 的 bufio.Scanner 来实现自定义协议解包。 协议数据包定义 本文模拟一个日志服务器,该服务器接收客户端传到的数据包并显示出来 type Package struct { Version [2]byte // 协议版本,暂定V1 Length int16 // 数据部分长度 Timestamp int64 // 时间戳 HostnameLength int16 // 主机名长度 Hostname []byte // 主机名 TagLength int16 // 标签长度 Tag []byte // 标签 Msg []byte // 日志数据} 协议定义部分没有什么好讲的,根据具体的业务逻辑...阅读全文

博文 2018-03-09 14:30:02 276815076

6行代码解决golang TCP粘包

什么是TCP粘包问题以及为什么会产生TCP粘包,本文不加讨论。本文使用golang的bufio.Scanner来实现自定义协议解包。 协议数据包定义 本文模拟一个日志服务器,该服务器接收客户端传到的数据包并显示出来 type Package struct { Version [2]byte // 协议版本,暂定V1 Length int16 // 数据部分长度 Timestamp int64 // 时间戳 HostnameLength int16 // 主机名长度 Hostname []byte // 主机名 TagLength int16 // 标签长度 Tag []byte // 标签 Msg []byte // 日志数据 } 协议定义部分没有什么好讲的,根据具体的业务逻辑定义即可。 数...阅读全文

博文 2018-03-02 18:34:40 xialeistudio

Golang + Protobuf 构造通讯协议

Golang 用于写网络通讯非常方便,其中消息通讯就可能会用到跨语言的Protobuf。本文讲述如何使用Protobuf构造Golang的通讯协议。 (1)Protobuf需要protoc,这个只要在github下载编译即可安装。Debian系也可以通过apt来安装。(2)第二个是go的插件,这个同样下载源代码后,执行go build 和 go install就能安装在$GOPATH路径下面,然后把该文件夹加入$PATH就可以使用了。(3)撰写proto文件,详情请参考官方文档。看起来是这样样子的: // poster.proto package poster; message Mail { required bytes type = 1; required bytes md5 = 2; r...阅读全文

博文 2017-05-20 14:22:44 Balyon

golang中tcp socket粘包问题和处理

在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格式是一个json格式的字符串: {"Id":1,"Name":"golang","Message":"message"} 当客户端发送数据给服务端的时候,如果服务端没有及时接收,客户端又发送了一条数据上来,这时候服务端才进行接收的话就会收到两个连续的字符串,形如: {"Id":1,"Name":"golang","Message":"message"}{"Id":1,"Name":"golang","Message":"message"} 如果接收缓冲区满了的话,那么也有可能接收到半截的json字符串,酱紫的话还怎么用json解码呢?真是头疼。以下用golang模拟了下这个粘包的产生。 备注...阅读全文

博文 2016-11-02 08:00:08 徐学良

golang中tcp socket粘包问题和处理

http://www.01happy.com/golang-tcp-socket-adhere/ 在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格式是一个json格式的字符串: {"Id":1,"Name":"golang","Message":"message"} 当客户端发送数据给服务端的时候,如果服务端没有及时接收,客户端又发送了一条数据上来,这时候服务端才进行接收的话就会收到两个连续的字符串,形如: {"Id":1,"Name":"golang","Message":"message"}{"Id":1,"Name":"golang","Message":"message"} 如果接收缓冲区满了的话,那么也有可能接收到半截的json...阅读全文

博文 2016-07-02 01:00:01 shijingxiang

Golang1.7闲来无事写了一个基于Gob的tcp通讯用的包

package gobconn import ( "encoding/gob" "errors" "net" "reflect" "sync" "unsafe" ) type message struct { Type string value reflect.Value } func (self message) Recovery() { putPointer(self.value) putMsg(self) } func (self message) Interface() interface{} { return self.value.Elem().Interface() } /* 声明一个消息池用来重用对象 */ var msgPool sync.Pool func getMsg()...阅读全文

博文 2016-10-13 17:00:05 fyxichen

golang json解析

Encode将一个对象编码成JSON数据,接受一个interface{}对象,返回[]byte和error:func Marshal(v interface{}) ([]byte, error)Marshal函数将会递归遍历整个对象,依次按成员类型对这个对象进行编码,类型转换规则如下:bool类型 转换为JSON的Boolean整数,浮点数等数值类型 转换为JSON的Numberstring 转换为JSON的字符串(带""引号)struct 转换为JSON的Object,再根据各个成员的类型递归打包数组或切片 转换为JSON的Array[]byte 会先进行base64编码然后转换为JSON字符串map 转换为JSON的Object,key必须是stringinterface{} 按照内部的...阅读全文

博文 2018-09-29 20:34:39 Michael_001

感觉发现了go变参的bug

代码如下,按照逻辑下面slice解包后应该没问题,可是下面的代码,有两处都报错 ```go package main func demo1(nums ...interface{}) { } func demo2(arg1 int, arg2 ...interface{}) { } func main() { nums1 := []int{1, 2, 3, 4} demo1(nums1) demo1(nums1...) //错误 nums2 := []interface{}{1,2,3,4} demo2(1, nums2...) demo2(1, nums1...) //错误 } ``...阅读全文

博文 2018-01-18 16:28:03 dwdcth

golang中archive/tar包详解

go语言官方标准库提供tar库,以方便对tar的操作 一、了解tar 什么是tar? tar是一种打包格式,但不对文件进行压缩,所以打包后的文档一般远远大于zip和tar.gz,因为不需要压缩的原因,所以打包的速度是非常快的,打包时CPU占用率也很低。 tar的目的是什么? 方便文件的管理(帮助理解:就是你存在很多文件的时候,但是你很多要很长时间不去接触的话,你想要变得更加简洁,可以进行tar操作,就可以变得更简洁,比如就像生活中,有很多小箱子分散在不同的房间里,可以将小箱子叠起来放在一个房间里,tar可以类似这样) 下面一张图可以帮助很好的理解 image.png (说明:图片来自维基百科,链接https://zh.wikipedia.org/wiki/Tar) 二、tar的操作 打包、解...阅读全文

博文 2018-11-30 20:34:42 laijh

[ gev ] Go 语言优雅处理 TCP “粘包”

https://github.com/Allenxuxu/gev > `gev` 是一个轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库,支持自定义协议,轻松快速搭建高性能服务器。 ## TCP 为什么会粘包 TCP 本身就是面向流的协议,就是一串没有界限的数据。所以本质上来说 TCP 粘包是一个伪命题。 TCP 底层并不关心上层业务数据,会套接字缓冲区的实际情况进行包的划分,一个完整的业务数据可能会被拆分成多次进行发送,也可能会将多个小的业务数据封装成一个大的数据包发送(Nagle算法)。 ## gev 如何优雅处理 gev 通过回调函数 `OnMessage` 通知用户数据到来,回调函数中会将用户数据缓冲区(ringbuffer)通过参数传递过来。 用户通过对 ringbu...阅读全文

博文 2019-11-01 10:56:55 Allenxuxu

golang的slice

声明与定义 Go中的slice的声明方法(有时候顺便也定义了),主要分为下面几种(以int为例): []int 后面可以也可以不跟上初始值,如 []int []int {} []int {1,2,3} 另外,直接从数组或者slice中再建立slice也是一种常见的模式: c[l:h:c] 最后一种是通过make来创建: make([]int, len, cap) 其中len,cap都是可选的,如果没有cap,缺省就是len那么大,如果没有len,缺省就是0。 添加 内置函数append是范型的添加,可以添加一个或者多个元素,也可以直接添加另外一个slice,这时候,需要使用...运算符进行解包,如: append(a, [] int {1,2,3}...) 不常用但是有时候也有用的,就是在s...阅读全文

博文 2019-02-10 11:34:44 areece

[ gev ] Go 语言优雅处理 TCP “粘包”

github.com/Allenxuxu/g… gev 是一个轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库,支持自定义协议,轻松快速搭建高性能服务器。 TCP 为什么会粘包 TCP 本身就是面向流的协议,就是一串没有界限的数据。所以本质上来说 TCP 粘包是一个伪命题。 TCP 底层并不关心上层业务数据,会套接字缓冲区的实际情况进行包的划分,一个完整的业务数据可能会被拆分成多次进行发送,也可能会将多个小的业务数据封装成一个大的数据包发送(Nagle算法)。 gev 如何优雅处理 gev 通过回调函数 OnMessage 通知用户数据到来,回调函数中会将用户数据缓冲区(ringbuffer)通过参数传递过来。 用户通过对 ringbuffer 操作,来进行数据解包,获取到完整...阅读全文

博文 2019-11-01 14:35:04 惜朝_

golang 1.13 errors 包 新函数介绍

引 这次 errors 包算重量级更新。很有更能把以前的一些设计模式给推到。下面聊下用法。 error 装包 以前返回一个错误,想要保存 error 链,还要定义结构体保存以前的 error 信息。感兴趣看下 syscal.ECONNREFUSED 如何封装到 url.Error 的。现在只要%w 就行 err = fmt.Errorf("第二层错误信息 %w", err) error 解包 如果是 fmt.Errorf("%w", err) 定义的错误链可以通过,或者实现了Unwrap接口的错误 e = errors.Unwrap(e) //解包错误 装包解包需要注意的地方 装包和解包错误是一一对应的,一次 Unwrap 调用,解一次 fmt.Errorf("%w", err)调用 pac...阅读全文

博文 2019-10-15 11:32:59 aside section ._1OhGeD

微信企业号文档坑

1. 签名加密对比 sha1(sort(token、timestamp、nonce、msg_encrypt)) sort表示的是这四个所对应的值的排序,而非K排序,排序结果和签名作对比 golang 例子: func getSign(array ...string) string{ strs:=array[:] sort.Strings(strs) signStr:=strings.Join(strs,"") sn:=sha1.New() sn.Write([]byte(signStr)) signData:=sn.Sum(nil) return fmt.Sprintf("%+x",signData) } 2. aes key: 需要将aesKey进行解密,解密是需要在原EncodingAE...阅读全文

博文 2019-08-13 18:32:47 高小震