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

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 陈杰斌

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...阅读全文

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 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

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

开发者必备的swift技巧

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

在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

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 解决 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

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

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中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

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

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 + 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 徐学良

微信企业号文档坑

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 高小震

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中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

[ 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

感觉发现了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的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 惜朝_

go语言-数组、字符串和切片

Go语言中数组、字符串和切片三者是密切相关的数据结构。这3种数据类型,在底层原始数据有着相同的内存结构,在上层,因为语法的限制而有着不同的行为表现。Go语言的数据是一种值类型,虽然数组的元素可以被修改,但是数组本身的赋值和函数传参都是以整体复制的方式处理的。Go语言字符串底层数据也是对应的字节数组,但是字符串的只读属性禁止了在程序中对底层字节数组的元素的修改。字符串赋值只是复制了数据地址和对应的长度,而不会导师底层数据的复制。切片的底层数据虽然也是对应数据类型的数组,但是每个切片还有独立的长度和容量信息,切片赋值和函数的传参时也是将切片头信息部分按传值方式处理。因为切片头含有底层数据的指针,所以它的赋值也不会导致底层数据的复制。一、数组 数组是一个由固定长度的特定类型元素组成的序列,一个数组...阅读全文

博文 2020-03-14 14:33:11 guoguocto

图解kubernetes中informer机制基础设计原理

kubernetes中的informer机制可能是实现集群控制模块的最核心的设计之一了,本文从informer如何获取数据开始,然后介绍了为了减少apiserver而设计的缓存、索引、无界队列、共享informer等机制欢迎一起交流学习 1. informer的本质 1.1 设计目标 之前说到kubernetes里面的apiserver的只负责数据的CRUD接口实现,并不负责业务逻辑的处理,所以k8s中就通过外挂controller通过对应资源的控制器来负责事件的处理,controller如何感知事件呢?答案就是informer 1.2 基于chunk的消息通知 watcher的设计在之前的文章中已经介绍,服务端是如何将watcher感知到的事件发送给informer呢?我们提到过apise...阅读全文

go语言容器

数组 var arr [3]int // 数组的每个元素都会被初始化为改类型的零值 var a [3]int = [3]int{1,2} a[2] // 0 q := [...]int{1,2,3} // ...表示初始化时会根据初始值的个数确定数组的长度 // 数组的长度是数组的一部分,必须是常量表达式,举例来说就是长度确定后不能再给它赋值 比较两个数组是否相等,一定要长度、类型、所有元素都相等时才会相等 数组遍历 var team [3]int = [3]int{1,2} team[2] = 3 for k, v := range team { fmt.Println(k,v) } 多维数组 var array [4][2]int array = [4][2]int{{1,2}, {2,...阅读全文

博文 2020-03-16 09:32:47 拉粑粑拉不出来