golang for遍历channel时需要注意的问题
2018年4月5日 · 122 字 · 1 分钟
最近在做一个基于RabbitMQ的应用,由于官方的qos没有golang的版本,所以出了一点问题。问题代码如下: _, ch, err := component.
2018年4月5日 · 122 字 · 1 分钟
最近在做一个基于RabbitMQ的应用,由于官方的qos没有golang的版本,所以出了一点问题。问题代码如下: _, ch, err := component.
2018年3月2日 · 567 字 · 3 分钟
什么是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年3月1日 · 243 字 · 2 分钟
最近在开发一个关注之后通过客服消息推送一张海报给用户的功能,海报图片是本地生成好的,需要上传到微信临时素材之后通过客服消息推送给用户。 上传文件需要multipart/form-data格式的表单,所以golang默认的http.POST方法是实现不了的。需要自行实现body参数逻辑。 上传请求初始化 // 新建上传请求 func NewUploadRequest(link string, params map[string]string, name, path string) (*http.
2018年3月1日 · 17 字 · 1 分钟
目前golang用的基础镜像是busybox,由于golang交叉编译之后只有一个二进制文件,可以直接部署到容器中运行,容器镜像大小几乎等于二进制文件大小。 带来的问题 由于基础镜像太过精简,目前遇到的问题是将时间戳格式化为时间字符串时发现差了8个小时。 尝试过的解决办法 刚开始使用了Location时区相关API,但是部署到容器中发现直接报错了,因为容器中缺少相关的系统调用函数。代码如下:
2018年3月1日 · 41 字 · 1 分钟
golang默认编码JSON时会将HTML标签中的尖括号编码为\u003c这种unicode字符。而最近在开发的微信客服消息推送就会出现以下结果 \u003ca href='https://www.example.com'\u003e点击进入\u003c/a\u003e 查看golang的json包发现json编码器有个方法SetEscapeHTML方法,接收一个bool值来设置是否保留HTML标签。 问题 json的Encoder只能编码到实现了io.
2018年2月28日 · 86 字 · 1 分钟
最近在做一个导出功能,最初是使用https://github.com/tealeg/xlsx做的,但是发现导出有个30W行的excel时,这玩意内存彪到700M+,后来发现只是导出数据为表格,并没有其他东西,于是打算使用CSV导出。 CSV格式简介 CSV本质上是个文本文件,该文件有以下要求: 列之间用逗号分隔,行之间用换行分隔 单元格如果有逗号,引号之类的字符,该单元格需要使用双引号括起来 如果包含中文,需要使用GBK编码,否则会乱码 golang实现 UTF8转GBK函数(需要 go get golang.
2018年2月8日 · 103 字 · 1 分钟
官网nodejs示例中只实现了服务端是单一service的情形,而对于服务端属于多个服务复用一个连接地址的例子却未实现。 查看thrift的nodejs库源码发现实际上还是支持的。以下来展示调用单一服务和多个服务的区别。 单一服务 var thrift = require('thrift'); var Calculator = require('.
2018年2月1日 · 321 字 · 2 分钟
golang的channel除了goroutine通信之外还有很多其他的功能,本文将实现一种基于channel的通用连接池。 何为通用? 连接池的实现不依赖具体的实例,而依赖某个接口,本文的连接池选用的是io.Closer接口,只要是实现了该接口的对象都可以被池管理。 当然,你可以实现基于interface{}的连接池,这样任何对象都可以被管理。 实现原理 将连接句柄存入channel中,由于缓存channel的特性,获取连接时如果池中有连接,将直接返回,如果池中没有连接,将阻塞或者新建连接(没超过最大限制的情况下)。 由于面向接口编程,所有创建连接的逻辑是不清楚的,这里需要传入一个函数,该函数返回一个io.
2018年1月31日 · 113 字 · 1 分钟
为什么要限制协程数量 golang的go关键字并发实在是太简单,但是带来的问题是由于硬件和网络状况的限制,不受控制的增加协程是非常危险的做法,甚至有可能搞垮数据库之类的应用! 而并发控制在go中是非常常用的技巧,以此文来记录一下学习历程。 原理 由于channel的阻塞机制,通过设置缓冲channel的缓冲大小来控制同时执行的协程数量。
2018年1月30日 · 67 字 · 1 分钟
头脑王者 本项目仅作为学习anyproxy之用,请勿用于非法用途,否则后果自负 功能 题目爬取 答题匹配(如果题库不存在,请自行答题,系统会在答题后把正确答案自动录入数据库) 开始 安装mysql,新建数据库tnwz,建表语句 CREATE TABLE tnwz.