介绍 在Go服务器中,每个传入请求都在其自己的goroutine中处理。 请求处理程序通常会启动其他goroutine来访问后端,例如数据库和RPC服务。 处理请求的goroutine集合通常需要访问特定于请求的值,例如最终用户的身份,授权令牌和请求的截止日期。 当请求被取消或超时时,处理该请求的所有goroutine都应该快速退出,以便系统可以回收他们正在使用的任何资源。 Context是专门用来简化对于处理单个请求,多个goroutine之间数据共享、取消信号、超时处理等相关操作。翻译自 G...
-
深入 Go 并发模型:Context
-
使用 CGO 和 GoReleaser 进行跨平台编译
我参与了一个开源项目 [Mailchain](https://github.com/mailchain/mailchain) ,该项目使用 Go 语言。我想使用 `CI\CD` 轻松的创建版本。 Golang 是一种允许以简单的方式编译代码,并在不同的操作系统上执行的语言。我发现了一个很棒的工具 [https://goreleaser.com/](https://goreleaser.com/) ,它可以用来构建,打包和发布二进制文件。 这是在 Mac 上构建的命令。 ```bash...
-
golang aes ecb 加密
代码地址:https://github.com/FakerGit/go-tools 加密模式 AES ECB模式 PKCS7Padding填充 原理 整个明文分成若干段相同的小段,然后对每一小段进行加密。这个是不安全的,重复的原文块加密后会是重复的结果,很明显暴露明文的模式。 代码 func PKCS7Padding(ciphertext []byte, blockSize int) []byte { padding := blockSize - len(ciphertext)%blockSiz...
-
细说Golang的JSON解析
之前一直写一些动态语言,觉得解析JOSN还是很简单的,往往只需要几行代码就能拿到解析好的JSON对象。Go语言自带的json包可以让你在程序中方便的读取和写入 JSON 数据。生成JSON场景相对简单一些,json.Marshal()会根据传入的结构体生成JSON数据。解析JSON会把数据解析到结构体中,由于JSON格式的自由组合的特点,尤其是那些结构复杂的JSON数据对新手来说声明接受JSON数据的结构体类型就会陷入不知从何下手的困扰。 最近工作中由于要解析JS和PHP程序持久化的JSON数据...
-
如何用 Go 实现热重启
热重启 热重启(Zero Downtime),指新老进程无缝切换,在替换过程中可保持对 client 的服务。 原理 父进程监听重启信号 在收到重启信号后,父进程调用 fork ,同时传递 socket 描述符给子进程 子进程接收并监听父进程传递的 socket 描述符 在子进程启动成功之后,父进程停止接收新连接,同时等待旧连接处理完成(或超时) 父进程退出,热重启完成 实现 package main import ( "context" "errors" "flag" "log" "net" ...
-
Go 逃逸分析
原文地址:Go 逃逸分析 什么是逃逸分析 堆和栈 要理解什么是逃逸分析会涉及堆和栈的一些基本知识,如果忘记的同学我们可以简单的回顾一下: 堆(Heap):一般来讲是人为手动进行管理,手动申请、分配、释放。堆适合不可预知大小的内存分配,这也意味着为此付出的代价是分配速度较慢,而且会形成内存碎片。 栈(Stack):由编译器进行管理,自动申请、分配、释放。一般不会太大,因此栈的分配和回收速度非常快;我们常见的函数参数(不同平台允许存放的数量不同),局部变量等都会存放在栈上。 栈分配内存只需要两个CP...
-
Go 编程:图解反射
原文发布在我的个人站点: Go 编程:图解反射 反射三原则太难理解,看一张图你就懂了。完美解释两个关键词 interface value 与 reflection object 是什么。 1. 图解反射 在使用反射之前,此文The Laws of Reflection必读。网上中文翻译版本不少,可以搜索阅读。 开始具体篇幅之前,先看一下反射三原则: Reflection goes from interface value to reflection object. Reflection goes...
-
Docker与Golang的巧妙结合
转载: Docker与Golang的巧妙结合【编者的话】这是一个展示在使用Go语言时如何让Docker更有用的提示与技巧的简辑。例如,如何使用不同版本的Go工具链来编译Go代码,如何交叉编译到不同的平台(并且测试结果!),或者如何制作真正小的容器镜像。
-
golang struct转map
struct转map package main import ( "fmt" "reflect" "time" ) type User struct { Id int64 Username string Password string Logintime time.Time } func Struct2Map(obj interface{}) map[string]interface{} { t := reflect.TypeOf(obj) v...
-
Gin框架踩坑——[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 400 with 200
这个报错场景为 : 1.Gin框架、2.编写POST请求方式接口、3.使用结构体绑定方式接受参数 该坑现象为 : 当结构体绑定参数失败时(即参数有误、传错时),httpcode为400,无论开发者如何强制返回httpcode,code就是400 原因 : 行为 – 这些方法MustBindWith在引擎盖下使用。如果存在绑定错误,则请求被中止c.AbortWithError(400, err).SetType(ErrorTypeBind)。这将响应状态码设置为400,并将Co...
-
Go语言的浮点型比较大小及其函数式编程魅力
我们在编程中经常需要对两个浮点型比较大小,下面我就来分享一段这样的代码,同时也展示了Go语言函数式编程的独特魅力: import ( "fmt" "math" ) func main() { // 设置精确度为0.00001 var a Accuracy = func() float64 { return 0.00001 } fmt.Println(a.Equal(0.11111222, 0.11111222233333)) //打印结果为:true } type Accuracy func()...
-
2019,Go GUI项目爆发的一年?
目前Go语言主要活跃在区块链、云计算、命令行工具和后端服务等领域。这些领域基本上和GUI关系不大。近来出现了很多跨平台的Go GUI项目。虽说用井喷之势形容有些过了,但是的确有加速的迹象。难道Go语言将要开辟出另一大块疆土? 忙中偷闲,整理了一份目前GUI/图形/图像相关的Go项目列表。见下。欢迎补充。 原生GUI绑定 dlgs是一个跨平台的显示对话框和输入框的Go代码库。 glfw是一个GLFW3绑定库。 go-mobile支持移动平台应用开发(Android和iOS)。(其中包含OpenGL...
-
使用 Goroutines 池来处理基于任务的操作
*作者注:使用 Go 语言工作了一段时间之后,我学会了如何使用无缓冲 channel 来构建 Goroutines 池,我喜欢这种方式胜于此文章中所展示的方式。话虽如此,此文章在它所描述的场景中依然有巨大价值。* 我在多个场合都被问到为什么使用工作池模式,为什么不在需要的时候启动所需要的 Goroutines?我的答案一直是:受限于工作的类型、你所拥有的计算资源和所处平台的限制,盲目地使用 Goroutines 将会导致程序运行缓慢,进而伤害整个系统的响应和性能。 每个程序、系统和平...
-
golang处理signal
signal一般用来实现优雅重启,或者重新加载配置文件等操作。 废话不多说,上表格 动作号码信号golang kill pid 15 SIGTERM terminated kill -9 pid 9 SIGKILL killed (应用程序无法捕获) kill -10 pid 10 SIGUSR1 user defined signal 1 kill -12 pid 12 SIGUSR2 user defined signal 2 ctrl+c 2 SIGINT interrupt ctrl+z...
-
一个好的 Go 语言 Makefile 是怎样的
精简的 Makefile,用于简化构建和管理用 Go 编写的 Web 服务器。 ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/a-good-makefile-for-go/makefile-process.gif) 我偶然调整我的 Makefiles 来加快我的开发过程,一天早上有点时间,我决定与大家分享其中诀窍。 总而言之,我使用 Go 构建 Web 服务器,我对 Makefile 的...
-
64行代码实现零拷贝go的TCP拆包粘包
# 64行代码实现零拷贝go的TCP拆包粘包 ### 前言 这段时间想用go写一个简单IM系统,就思考了一下go语言TCP的拆包粘包。TCP的拆包粘包有一般有三种解决方案。 #### 使用定长字节 实际使用中,少于固定字长的,要用字符去填充,空间使用率不够高。 #### 使用分隔符 一般用文本传输的,使用分隔符,IM系统一般对性能要求高,不推荐使用文本传输。 #### 用消息的头字节标识消息内容的长度 可以使用二进制传输,效率高,推荐。下面看看怎么...
-
json序列化和反序列化
序列化和反序列化 1、JSON的序列化 1.1序列化 struct、map、slice 对于json的序列化和反序列化,go的encoding/json 包提供了一些列的方法。 常用的比如 func Marshal(v interface{}) ([]byte, error) 序列化 func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) 同Marshal,并且可以格式化 第一个参数是要序列化的数据,第二个...
-
Go源码:协程栈
原文:Go源码:协程栈 提示 Go版本为1.12 灵感来自Contiguous stacks 涉及实现细节,需要有Stack Frame和指针操作基础。 前言 在1.4版本之前go的协程栈管理使用分段栈机制实现。实现方式:当检测到函数需要更多栈时,分配一块新栈,旧栈和新栈使用指针连接起来,函数返回就释放。 这样的机制存在2个问题: 多次循环调用同一个函数会出现“hot split”问题,例子:stacksplit.go 每次分配和释放都要额外消耗 为了解决这2个问题,官方使用:连续栈。连续栈的实...
-
17Go 语言——几个并发模式
并发模式 要想写出高效简单的并发程序,还需要了解下常用的 goroutine和channel以哪种方式写,下面介绍3种常用的并发模式,写出更简化高效的并发。 1、runner Runner 模式可以理解为执行者,也就是来控制程序的执行,它可以去执行任何程序,程序都是受监控的,可以去终止这些程序。当我们需要调度后台处理任务程序的时候,这种模式很拥有。简单说就是,控制 、执行,中断、退出。 创建 Runner 结构体 /* runner 可以执行任何程序,可以监控程序,可以发送信号终止程序 */ t...
-
你为什么要喜欢 sync.Pool ?
## 介绍 因为它很快。通过文章底部存储库中的基准测试可以减少**4982 倍**的内存占用。 ![Comparing pool performance. Less than better.](https://raw.githubusercontent.com/studygolang/gctt-images/master/Why-you-should-like-sync.Pool/1.png) 相比之下, Pool 的性能更快更好。 ## Ok, 这究竟是怎么回事呢? ...
-
如何使用 Go kit 工具包编写微服务
我在互联网上搜索了很久关于使用 Go kit 工具包编写微服务的精品教程(我认为我的 Google-fu 相当不错),但是 我没有找到 ...... 来自[Go kit 代码库的示例](https://github.com/go-kit/kit/examples) 很好,但恕我直言,文档很枯燥。 然后我决定购买这本名为 `Go Programming Blueprints, 2nd Edition` 的书,这本书相当不错,但只有两章专门讨论 Go kit(一个用于实际开发微服务...
-
gRPC+gRPC Gateway 能不能不用证书?
gRPC+gRPC Gateway 能不能不用证书? 如果你以前有涉猎过 gRPC+gRPC Gateway 这两个组件,你肯定会遇到这个问题,就是 “为什么非得开 TLS,才能够实现同端口双流量,能不能不开?” 又或是 “我不想用证书就实现这些功能,行不行?”。我被无数的人问过无数次这些问题,也说服过很多人,但说服归说服,不代表放弃。前年不行,不代表今年不行,在今天我希望分享来龙去脉和具体的实现方式给你。 过去 为什么 h2 不行 因为 net/http2 仅支持 "h2" 标识,而 "h2"...
-
golang sync.Pool 分析
在 echo 官网的手册上可以看到 echo 框架的路由性能主要依赖于 radix tree 和 sync.pool 对内存的复用。 Echo 的路由基于 radix tree ,它让路由的查询非常快。路由使用了 sync pool 来重复利用内存并且几乎达到了零内存占用。 对于高并发的应用来说,大量的 goroutines 的内存申请确实是个负担。想知道为什么需要用 sync.pool,了解代码中为什么使用了这个模块会提高性能,以及有哪些注意点,需要对 sync.pool 有一定的熟悉。先来看...
-
使用go build 进行条件编译
当我们编写的go代码依赖特定平台或者cpu架构的时候,我们需要给出不同的实现 C语言有预处理器,可以通过宏或者#define包含特定平台指定的代码进行编译 但是Go没有预处理器,他是通过 go/build包 里定义的tags和命名约定来让Go的包可以管理不同平台的代码 这篇文章将讲述Go的条件编译系统是如何实现的,并且通过实例来说明如何使用 1. 预备知识:go list命令的使用 在讲条件编译之前需要了解go list的简单用法 go list访问源文件里那些能够影响编译进程内...
-
一个示例阐述 Go 应用的优雅中止
写在前面 适用人群 代码级支持优雅中止是必要的 优雅中止的含义 Kubernetes 中 Pod 的终止机制 优雅中止的 Go 代码示例 源码解读-优雅中止的处理思路 源码解读-值得关注的几个点 小结 参考 写在前面 按照一般的设计原则, 每个 HTTP 请求都是无状态的,因此大多情况下 Web 应用都很容易做水平扩展。“无状态”也意味着 HTTP 请求发起重试的成本是很低的,从而使得 Web 接口的开发很少关注优雅中止(一部分也因为 Web 框架做了这部分的考虑)。 不过,业务中 ① 总会存在...
-
获取 Goroutine ID
## Goroutine ID 真实存在吗? 当然存在。 Go 运行时一定有某种方法来跟踪 goroutine ID。 ## 那我该使用它们吗? 不该。 - 原因一:https://groups.google.com/forum/#!topic/golang-nuts/Nt0hVV_nqHE - 原因二:https://groups.google.com/forum/#!topic/golang-nuts/0HGyCOrhuuI - 原因三:http://...
-
Go语言交叉编译工具gox
基本介绍 交叉编译是为了在不同平台编译出其他平台的程序,比如在Linux编译出Windows程序,在Windows能编译出Linux程序,32位系统下编译出64位程序,今天介绍的gox就是其中一款交叉编译工具。 配置环境 首先配置好Go语言的环境变量,并在~/.bash_profile中设置,简单说明一下为什么要添加至该文件,首先以下代码在终端执行完成后只对当前会话有效,关闭终端变量就失效了,而.bash_profile文件在用户每次登录时都会执行一次,把环境变量设置到该文件中,每次登录都会初始...
-
2019年最火热的Golang项目
整理目的 记录用的人较多或者出镜率比较高的Golang项目。 如果我漏了你觉得重要的项目,麻烦帮我指出,我尽快补上,谢谢! 下面列表中的每一个项目都配上了Star增长趋势的图片,可以看出该项目的热度。 特别是与区块链相关的两个项目fabric和go-ethereum,能够明显看出区块链行业的起伏。 整理过程中收获: 1、了解到docker项目已经改名为moby,当前仓库为:https://github.com/moby/moby。 2、了解到时间序列数据库,库中每一个数据都有时间属性。 项目列表...
-
golang cgo windows mingw64 环境搭建
[TOC] 准备 网络一定要ok 提前安装好 cmder 或者 cygwin,涉及大量命令操作,而windows本身命令行非常难用,不适合开发 安装 Mingw-w64 MinGW全称Minimalist GNU For Windows,是个精简的Windows平台C/C++、ADA及Fortran编译器 相比Cygwin而言,体积要小很多,使用较为方便。 MinGW提供了一套完整的开源编译工具集,以适合Windows平台应用开发,且不依赖任何第三方C运行时库 MinGW包括: 一套集成编译器,...
-
Golang在Ubuntu 上使用Oracle数据库
一、安装Oracle的OCI套件 1、OCI下载链接页面下载(instantclient-basic,instantclient-sdk) http://www.oracle.com/technetwor ... t/index-097480.html 2、解压缩到同一个目录下,比如:instantclient_12_1 3、root权限移动文件夹到目录 /usr/lib 下 2、root权限执行以下命令 ## 其实直接cp拷贝过去也是一样的 ln /usr/lib/instantclient...
-
【GO】串口简单通讯
背景 最近再学习 go 语言,在某宝用5块钱买了个教学视频 8 日速成,目前看到了第3天的视频,进度龟速。。。。。这周末加油! 然后,学习 go 语言的目的是想用 go 做自动测试,我是只学过 C ,感觉 go 语言和 C 比较相近,学起来比较简单、迅速。 串口通讯代码 golang 串口源码:https://github.com/huin/goserial 对于 go 的串口通讯要求如下: Data Bits:8 Stop Bits:1 Parity:None Hardware Flow Co...
-
Golang项目的测试实践
Golang项目的测试实践 最近有一个项目,链路涉及了4个服务。最核心的是一个配时服务。要如何对这个项目进行测试,保证输出质量,是最近思考和实践的重点。这篇就说下最近这个实践的过程总结。 测试金字塔 按照Mike Cohn提出的“测试金字塔”概念,测试分为4个层次 最下面是单元测试,单元测试对代码进行测试。再而上是集成测试,它对一个服务的接口进行测试。继而是端到端的测试,我也称他为链路测试,它负责从一个链路的入口输入测试用例,验证输出的系统的结果。再上一层是我们最常用的UI测试,就是测试人员在U...
-
【Go语言实战】字符编码GBK、UTF8转换
近期计划开发一个小说阅读APP,本意是学习golang开发,以及爬虫设计。 一般规范些的站点,会采用utf-8编码开发运行在浏览器上。然而,在我抓取的某些网站,却是采用的GBK编码,因此,在解析dom后,获取中文内容的时候,总是会出现一些编码问题,导致我并不能确认,解析到的内容,是不是就是我想要的,我期望的。 为了解决这个问题,我面向百度,面向goole编程,最终找到了一个可靠的解决办法,即goole的text库(golang.org/x/text),并把对应的方法做了简单的封装。 // tra...
-
Golang Failpoint 的设计与实现
作者:龙恒 对于一个大型复杂的系统来说,通常包含多个模块或多个组件构成,模拟各个子系统的故障是测试中必不可少的环节,并且这些故障模拟必须做到无侵入地集成到自动化测试系统中,通过在自动化测试中自动激活这些故障点来模拟故障,并观测最终结果是否符合预期结果来判断系统的正确性和稳定性。如果在一个分布式系统中需要专门请一位同事来插拔网线来模拟网络异常,一个存储系统中需要通过破坏硬盘来模拟磁盘损坏,昂贵的测试成本会让测试成为一场灾难,并且难以模拟一些需要精细化控制的的测试。所以我们需要一些自动化的方式来进行...
-
golang库收集
数据结构 一个让业务开发效率提升10倍的库 gods数据结构库 工具 前端输入数据验证工具包 资源大礼包 资源大礼包
-
以后台进程方式运行 Go 程序
从 1999 年那时开始我就为 windows 写过服务,一开始用 C/C++,后来用 C#。现在我在 Linux 上用 Go 编写服务端软件。然而我没辙了。更令人沮丧的是,我一开始编写软件所用的操作系统并不是我即将部署所用的操作系统。当然,那是后话了。 我想要在我的 Mac 上以后台进程(守护进程)的方式运行代码。而我的问题也是,我无从下手。 我很幸运在 Bitbucket 上找到了由 Daniel Theophanes 编写的名为 [service](https://bitbuc...
-
golang json库gjson的使用
官方的json库, 只支持整体的序列化与反序列化. 像其它语言的库, json库都支持单个getValue/setValue这类操作. 找了下golang相关的开源json库, GJSON star数不错,支持的查询功能很丰富. 但是没有写入接口. 找了一圈也没有 找到有写入功能的json库. 能想到的只有定义类型序列化或map序列化了. 以下是正文, 翻译自项目readme: 开始 开始使用GJSON之前, 先安装Go, 然后运行go get: $ go get -u github.com/t...
-
Go 语言的优点,缺点和令人厌恶的设计
这是关于 「[Go是一门设计糟糕的编程语言 (Go is not good)](https://github.com/ksimka/go-is-not-good)」 系列的另一篇文章。Go 确实有一些很棒的特性,所以我在这篇文章中展示了它的优点。但是总体而言,当超过 API 或者网络服务器(这也是它的设计所在)的范畴,用 Go 处理商业领域的逻辑时,我感觉它用起来麻烦而且痛苦。就算在网络编程方面,Go 的设计和实现也存在诸多问题,这使它看上去简单实际则暗藏危险。 写这篇文章的动机是因为我最...
-
深度解密Go语言之关于 interface 的 10 个问题
这次文章依然很长,基本上涵盖了 `interface` 的方方面面,有例子,有源码分析,有汇编分析,前前后后写了 20 多天。洋洋洒洒,长篇大论,依然有些东西没有涉及到,比如文章里没有写到`反射`,当然,后面会单独写一篇关于`反射`的文章,这是后话。 还是希望你在看完文章后能有所收获,有任何问题或意见建议,欢迎在文章后面留言。 这篇文章的架构比较简单,直接抛出 10 个问题,一一解答。 ![](https://static.studygolang.com/190425/92cc681d50...
-
使用Go 语言开发必备的5大开源工具
开源最前线(ID:OpenSourceTop)编译链接:https://jaxenter.com/golang-open-source-tools-154472.html前不久,jaxenter发布了2018年最热门的十大技能技术其中,Go语言跻身前十,成2018年最受欢迎的技能之一。近日,jaxenter又从GitHub上精选了一些最好Golang工具,希望可以为喜欢用Go编程的开发者提供帮助,一起来看一下都有哪些工具上榜吧1、Go Reviverevive 是一个 Go 语言的代码质量检测工...
-
两个随机数函数的故事
我经常有一些困惑,`crypto/rand` 包和 `math/rand` 包是如何关联的,或者它们是如何按照预期的方式(一起)工作的?这是其他人已经思考过的问题,还是仅仅我个人的突发奇想呢?终于有一天,我决定攻克这个问题,这篇博客就是这次努力的结果。 ## `math` 包 如果你曾经关注过 `math/rand` 包,你会同意它提供了相当易用的 API。我最喜欢的例子是 `func Intn(n int) int` 函数,它返回了一个你指定范围内的随机数。非常有用! 你也许...