64行代码实现零拷贝go的TCP拆包粘包

# 64行代码实现零拷贝go的TCP拆包粘包 ### 前言 这段时间想用go写一个简单IM系统,就思考了一下go语言TCP的拆包粘包。TCP的拆包粘包有一般有三种解决方案。 #### 使用定长字节 实际使用中,少于固定字长的,要用字符去填充,空间使用率不够高。 #### 使用分隔符 一般用文本传输的,使用分隔符,IM系统一般对性能要求高,不推荐使用文本传输。 #### 用消息的头字节标识消息内容的长度 可以使用二进制传输,效率高,推荐。下面看看怎么...阅读全文

2018-01-01 15:21:05 alberliu
阅读:7706 评论:2

在 Go 语言中使用 casbin 实现基于角色的 HTTP 权限控制

身份认证和授权对 web 应用的安全至关重要。最近,我用 Go 完成了我的第一个正式的 web 应用,这篇文章是在这个过程中我所学到的部分内容。 本文中,我们的关注点在于如何在 web 应用中使用开源的 casbin 库进行 HTTP 权限控制。同时,在示例代码中我们使用了 scs 库进行 session 管理。 下面的例子十分基础,希望它尽可能的展示了如何在 Go web 应用中实现权限控制。为了更侧重于展示 casbin 的使用,我们尽量简化业务逻辑(例如:不需密码的登陆操作)。...阅读全文

阅读:27961 评论:3

优雅的处理错误,而不仅仅只是检查错误

这篇文章摘取至我在日本东京举办的 [GoCon spring conference](https://gocon.connpass.com/event/27521/) 上的演讲稿。 ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/error-handle/ba5a9ada.png) ## 错误只是一些值 我花了很多时间来思考如何在 Go 中处理错误是最好的。我真希望能有一种简单直接的方式来...阅读全文

阅读:4606 评论:0

Golang 中的微服务-第 4 部分-使用 JWT 做认证

在之前的文章里,我们创建了一个用户服务,保存了一些用户。现在我们看下如何在用户服务中安全的保存用户密码,同时,通过微服务写几个功能,来验证用户,发布安全令牌。 注意,我现在已经把我们的服务拆分到几个不同的仓库里。 我觉得这样部署起来容易些。 最开始我打算做成一个单独的仓库,但是发现用 Go 的 dep 管理有点麻烦,有很多冲突。我也会说明下如何独立地运行和测试微服务。 遗憾的是,用这种方法我们就不能用 docker-compose 了。 不过目前用起来还不错。如果你在这方面有什么建议...阅读全文

2018-03-03 20:17:08 ArisAries
阅读:6932 评论:0

实现一个 Golang 调试器(第一部分)

写这个系列的目的不是为了列出 Golang 编程语言的调试器的所有特性。如果你想看这些内容,可以看下 [Delve](https://github.com/derekparker/delve)。在这篇文章里我们试着去探索下调试器通常是怎样工作的,怎么在 Linux 上完成一个基本的调试,Linux 上比较关心 Golang 的功能,比如 [goroutine](https://golang.org/ref/spec#Go_statements) 。 创建调试器没那么简单。就这一个话题我们单...阅读全文

2018-03-10 16:24:12 ArisAries
阅读:3541 评论:0

Go 中的任务队列

在 [RapidLoop](https://www.rapidloop.com/) 中,我们几乎用 [Go](https://golang.org) 做所有事情,包括我们的服务器,应用服务和监控系统 [OpsDash](https://www.opsdash.com/)。 Go 十分擅长编写异步程序 - goroutine 和 channel 使用十分简单不容易出错并且和其他语言相比异步/等待模式,语法和功能都更加强大。请继续阅读来瞧瞧围绕任务队列的一些有趣的 Go 代码。 ## 不...阅读全文

2018-03-19 10:51:44 saberuster
阅读:12026 评论:4

实现一个 Golang 调试器(第二部分)

在[第一部分](https://studygolang.com/articles/12553)里,我们首先介绍了开发环境并且实现了一个简单的调试器(tracer),它可以使子进程(tracee)在最开始处停止运行,然后继续执行,并显示它的标准输出。现在是扩展这个程序的时候了。 通常,调试器允许单步执行被调试的代码,这个可以通过 [ptrace](http://man7.org/linux/man-pages/man2/ptrace.2.html) 的 PTRACE_SINGLESTEP 命...阅读全文

2018-04-14 10:19:15 jettyhan
阅读:2210 评论:1

实现一个 Golang 调试器(第三部分)

到目前为止我们已经知道如何单步执行用 ptrace 暂停的进程(tracee)以及如何从二进制文件中获取一些调试信息(在[这里](https://studygolang.com/articles/12794)阅读相关内容)。接下来就是设置断点,等待程序运行到断点处,查看进程相关信息的时候了。 让我们从上一篇文章中用到的汇编代码开始 ```asm section .data msg db "hello, world!", 0xA len equ $ - ms...阅读全文

2018-04-15 16:57:15 jettyhan
阅读:2272 评论:0

记一次golang中sync.Map并发创建、读取的问题

背景: 我们有一个用go做的项目,其中用到了zmq4进行通信,一个简单的rpc过程,早期远端是使用一个map去做ip和具体socket的映射。 问题 大概是这样 struct SocketMap { sync.Mutex sockets map[string]*zmq4.Socket } 然后调用的时候的代码大概就是这样的: func (pushList *SocketMap) push(ip string, data []byte) { pushList.Lock() defer pushLi...阅读全文

阅读:4241 评论:1

【golang-GUI开发】项目的编译

在上一篇文章里,我们讲到了安装therecipe/qt(https://www.cnblogs.com/apocelipes/p/9296754.html),现在我们来讲讲如何编译使用了therecipe/qt的项目。 therecipe/qt以下简称qt,和Qt加以区分。 为什么不能直接使用go build 因为qt使用了moc技术(元对象编译器),对于一些Qt的扩展语法需要进行额外的处理,用C++写过Qt项目的读者应该知道不能直接用g++或者其他编译器去编译项目代码,而是通过qmake生成的...阅读全文

2018-07-12 16:48 apocelipes
阅读:2680 评论:1

使用 Go 在 WASM 中进行图像处理的实验

Go 的主分支最近完成了一个 WebAssembly 的工作原型实现。作为 WASM 的爱好者,我自然要把玩一下。 这篇文章,我要记下周末我用 Go 做的处理图像实验的想法。这个演示只是从浏览器中获取图像输入,然后应用各种图像变换,如亮度,对比度,色调,饱和度等,最后将其转储回浏览器。这测试了两件事 - 简单的CPU绑定执行,这是图像转换应该做的事情,以及在 JS 和 Go 之间传递数据。 ## 回调 应该明确如何在 JS 和 Go 之间进行调用,不是我们在 emscripte...阅读全文

2018-07-22 21:24:13 themoonbear
阅读:2480 评论:0

使用 JWT 保护 API 访问

APIs 的一个常见用例是提供一个授权中间件,允许客户端向 APIs 发送授权请求。通常来说,客户端会执行一些授权逻辑,产生一个「会话标识」。最近比较流行的 JWT ( JSON Web Tokens ) 提供了一个带超时时间的「会话标识」,使用它不需要额外的空间来执行验证逻辑。 本文是接着上一篇文章写的,在阅读下面内容之前建议先看一下之前的那篇文章 [用 go-chi 处理 HTTP 请求](https://scene-si.org/2018/03/12/handling-http-re...阅读全文

2018-07-29 22:31:34 jettyhan
阅读:2651 评论:2

Go语言的错误处理

序言 错误处理在每个语言中都是一项重要内容。众所周知,通常写程序时遇到的分为异常与错误两种,Golang中也不例外。Golang遵循『少即是多』的设计哲学,错误处理也力求简洁明了,在错误处理上采用了类似c语言的错误处理方案,另外在错误之外也有异常的概念,Golang中引入两个内置函数panic和recover来触发和终止异常处理流程。 基础知识 错误指的是可能出现问题的地方出现了问题,比如打开一个文件时可能失败,这种情况在人们的意料之中 ;而异常指的是不应该出现问题的地方出现了问题,比如引用了空...阅读全文

2018-08-13 15:35:34 narcissu
阅读:6140 评论:0

深度 | 从Go高性能日志库zap看如何实现高性能Go组件

导语:zap是uber开源的Go高性能日志库。本文作者深入分析了zap的架构设计和具体实现,揭示了zap高效的原因。并且对如何构建高性能Go语言库给出自己的建议。作者简介:李子昂,美图公司架构平台系统研发工程师,从事长连接服务和分布式存储组件的研发和支持。摘要日志在整个工程实践中的重要性不言而喻,在选择日志组件的时候也有多方面的考量。详细、正确和及时的反馈是必不可少的,但是整个性能表现是否也是必要考虑的点呢?美图技术团队在长期的实践中发现有的日志组件对于计算资源的消耗十分巨大,这将导致整个服务成...阅读全文

2019-12-24 17:01:22 高可用架构
阅读:3127 评论:0

[译]Golang中的依赖注入

[译]Golang中的依赖注入 文章来源:Dependency Injection in Go关于作者:Drew Olson作者博客:software is fun译者按:本文用于介绍DI和golang中DI库dig的简单使用,适合对go有一定了解的开发者。 我最近使用Go创建了一个小项目,由于最近几年一直用Java,我立刻就被Go语言生态里依赖注入(DI)的缺失震惊了。我决定尝试用Uber的dig库来创建我的项目,结果非常不错。 我发觉DI帮我解决了很多在以前的Go应用中遇到的问题——init...阅读全文

2018-08-24 17:35:04 AlexTuan
阅读:2732 评论:0

Go+PHP实现敏感词检测

概述 广告,敏感词检测一直以来都是让人头疼的话题,仅仅通过添加敏感词列表是解决不了问题的。今天封禁了这个词,明天又会有新的违禁词冒出来,比起愚公无穷尽的子孙更甚。 敏感词匹配这种治标不治本的方法,在一定的语义下蛮有效的,但是这个场景对高并发,访问QPS高的服务来说,不是很合适。前段时间看到垃圾邮件检测用到的贝叶斯分类算法,这种“半学习”形式的方法的准确度依赖于先验概率的准确性,而公司长期以来整理到的违禁词列表就是一个很好的源,随着贝叶斯分类的数据越来越多,分类的准确性也会越来越高,后期仅仅需要对...阅读全文

2018.09.14 11:25 尽情的嘲笑我吧
阅读:1100 评论:0

CHAOS-简单实用的后门生成工具

CHAOS是一款非常简单实用的后门生成和监听工具,GitHub传送门 由于CHAOS是用Go语言编写的,因此第一步要安装Golang和UPX package,后者可以自动给生成的后门程序加上UPX的壳 root权限运行 apt install golang upx-ucl -y 拉取项目到本地 git clone https://github.com/tiagorlampert/CHAOS.git 运行 cd CHAOS/ go run CHAOS.go 进入下面的界面 可以看到有五个参数,第一...阅读全文

2018.09.15 00:47 TryHard3r
阅读:2727 评论:0

go gin+casbin RBAC 简单例子

go gin+casbin RBAC 简单例子 说明 利用的库: github.com/casbin/casbin github.com/gin-gonic/gin github.com/facebookgo/inject 本文为 参考此项目: https://github.com/LyricTian/gin-admin ,强烈推荐!!! casbin文档: https://casbin.org/zh-CN/ 下面例子 未利用 casbin 的 adapter, 而是启动的时候 先初始化, 然后...阅读全文

2019-01-10 16:20:53 295631788
阅读:8033 评论:0