Go 拾遗

收录了 75 篇文章 · 3 人关注

  • Golang程序员开发效率神器汇总!

    一. 开发工具1)sql2go用于将 sql 语句转换为 golang 的 struct. 使用 ddl 语句即可。例如对于创建表的语句: show create table xxx. 将输出的语句,直接粘贴进去就行。http://stming.cn/tool/sql2go.html2)toml2go用于将编码后的 toml 文本转换问 golang 的 struct.https://xuri.me/toml-to-go/3)curl2go用来将 curl 命令转化为具体的 golang 代码....

  • Go 资源整理,这里有你想要的💊

    嗯~世界上第二好的语言,这里有你可能想要的💊在 GitHub 上稳定更新,觉得不错请点个 Star ❤️ 如转载分享,请保留出处,谢谢 😆 原文地址: https://shockerli.net/post/go... GitHub: https://github.com/shockerli/... 官网: https://golang.org国内官网镜像(访问快~): https://golang.google.cn GitHub: https://github.com/golang/go Wi...

  • Redis优化高并发下的秒杀性能

    本文内容 使用Redis优化高并发场景下的接口性能 数据库乐观锁 随着双11的临近,各种促销活动开始变得热门起来,比较主流的有秒杀、抢优惠券、拼团等等。 涉及到高并发争抢同一个资源的主要场景有秒杀和抢优惠券。 前提 活动规则 奖品数量有限,比如100个 不限制参与用户数 每个用户只能参与1次秒杀 活动要求 不能多发,也不能少发,100个奖品要全部发出去 1个用户最多抢1个奖品 遵循先到先得原则,先来的用户有奖品 数据库实现 悲观锁性能太差,本文不予讨论,讨论一下使用乐观锁解决高并发问题的优缺点。...

  • [译]Golang应付百万级请求/分钟

    原文:medium.com/smsjunk/han… 我在不同公司从事反爬虫、反病毒、反恶意程序已经有15年了,我知道,由于每天需要处理和应对的大量数据,这些系统最终会因此变得十分复杂。 目前我是smsjunk.com的CEO以及KnowBe4的首席架构师,两家公司都是活跃与网络安全行业。 有趣的是在过去10年作为一名软件工程师,几乎所有我参与的后端开发项目里面都是用Ruby on Rails来完成的。可是你不要误会,我热爱Ruby on Rails并且我认为它是一个非常出色的开发环境,但当你用...

  • golang 服务平滑重启小结

    golang 服务平滑重启小结 背景 golang 程序平滑重启框架 supervisor 出现 defunct 原因 使用 master/worker 模式 背景 在业务快速增长中,前期只是验证模式是否可行,初期忽略程序发布重启带来的暂短停机影响。当模式实验成熟之后会逐渐放量,此时我们的发布停机带来的影响就会大很多。我们整个服务都是基于云,请求流量从 四层->七层->机器。 要想实现平滑重启大致有三种方案,一种是在流量调度的入口处理,一般的做法是 ApiGateway + CD ,发布的时候自...

  • 使用 Go 处理中间件

    简介 gin 的中间件 创建中间件 总结 当前部分的代码 简介 开发 web 应用的时候, 很多地方都需要使用中间件来统一处理一些任务,比如记录日志, 登录校验等. gin 也提供了中间件功能. gin 的中间件 在项目创建之初, 就已经导入了一些中间件, 当时没有仔细介绍. g.Use(gin.Logger()) g.Use(gin.Recovery()) g.Use(middleware.NoCache()) g.Use(middleware.Options()) g.Use(middlew...

  • 秒杀系统的艺术

    12306抢票,极限并发带来的思考? 每到节假日期间,一二线城市返乡、外出游玩的人们几乎都面临着一个问题:抢火车票!虽然现在大多数情况下都能订到票,但是放票瞬间即无票的场景,相信大家都深有体会。尤其是春节期间,大家不仅使用12306,还会考虑“智行”和其他的抢票软件,全国上下几亿人在这段时间都在抢票。“12306服务”承受着这个世界上任何秒杀系统都无法超越的QPS,上百万的并发再正常不过了!笔者专门研究了一下“12306”的服务端架构,学习到了其系统设计上很多亮点,在这里和大家分享一下并模拟一个...

  • EMQ百万级MQTT消息服务(TLS Docker Golang)

    附上: 喵了个咪的博客:w-blog.cn EMQ官方地址:http://emqtt.com/ EMQ中文文档:http://emqtt.com/docs/v2/guide.html 1.TLS证书验证 为了保障安全.我们常常会使用HTTPS来保障请求不被篡改,作为MQTT使用TLS加密的方式来保障传输安全 EMQ默认使用的TLS加密的端口是8883端口,默认证书在EMQ目录下etc/certs: 对应的配置文件在emq.conf中,可以修改你的端口和配置文件路径 listener.ssl.ex...

  • Golang实现请求限流的几种办法

    在开发高并发系统时,有三把利器用来保护系统:缓存、降级和限流。那么何为限流呢?顾名思义,限流就是限制流量,就像你宽带包了1个G的流量,用完了就没了。 简单的并发控制 利用 channel 的缓冲设定,我们就可以来实现并发的限制。我们只要在执行并发的同时,往一个带有缓冲的 channel 里写入点东西(随便写啥,内容不重要)。让并发的 goroutine在执行完成后把这个 channel 里的东西给读走。这样整个并发的数量就讲控制在这个 channel的缓冲区大小上。 比如我们可以用一个 bool...

  • go平滑重启调研选型和项目实践

    原文链接 github 什么是平滑重启 当线上代码需要更新时,我们平时一般的做法需要先关闭服务然后再重启服务. 这时线上可能存在大量正在处理的请求, 这时如果我们直接关闭服务会造成请求全部 中断, 影响用户体验; 在重启重新提供服务之前, 新请求进来也会502. 这时就出现两个需要解决的问题: 老服务正在处理的请求必须处理完才能退出(优雅退出) 新进来的请求需要正常处理,服务不能中断(平滑重启) 本文主要结合linux和Golang中相关实现来介绍如何选型与实践过程. 优雅退出 在实现优雅重启之...

  • 干货满满的 Go Modules 和 goproxy.cn

    大家好,我是一只普通的煎鱼,周四晚上很有幸邀请到 goproxy.cn 的作者 @盛傲飞(@aofei) 到 Go 夜读给我们进行第 61 期 《Go Modules、Go Module Proxy 和 goproxy.cn》的技术分享。 本次 @盛傲飞 的夜读分享,是对 Go Modules 的一次很好的解读,比较贴近工程实践,我必然希望把这块的知识更多的分享给大家,因此有了今天本篇文章,同时大家也可以多关注 Go 夜读,每周会通过 zoom 在线直播的方式分享 Go 相关的技术话题,希望对大...

  • 用 go 实现一个分布式限流器

    项目中需要对 api 的接口进行限流,但是麻烦的是,api 可能有多个节点,传统的本地限流无法处理这个问题。限流的算法有很多,比如计数器法,漏斗法,令牌桶法,等等。各有利弊,相关博文网上很多,这里不再赘述。 项目的要求主要有以下几点: 支持本地/分布式限流,接口统一 支持多种限流算法的切换 方便配置,配置方式不确定 go 语言不是很支持 OOP,我在实现的时候是按 Java 的思路走的,所以看起来有点不伦不类,希望能抛砖引玉。 1. 接口定义 package ratelimit import "...

  • 避免诸如 base、util、common 之类的包名

    写一个好的 Go 语言包的开端是起一个好名字。将你的包名视为一个 elevator pitch,你必须用一个单词来说明。 包名不好的一个普遍的原因是被命名为 *utility*,这些包混合了 helpers 和 utility 代码,还包含了各种各样不相关的函数,因此根据它们提供的内容很难描述其作用。这经常导致一个包的名字取决于它所包含内容:实用工具(utilities)。 在开发一些深层次包结构的项目时,为了避免出现循环引用,同时复用辅助函数,通常会出现类似 *utils* 或 *...

  • MySQL 亿级数据量水平分库实践

    需求背景 水平拆分和垂直拆分一直是最常见的数据库优化方式,笔者所在的部门所使用的数据库一直是主从热备的架构,但数据量在一年前就已经破亿,并以飞快的增长速度不断增加。为了减小数据库的负担,提高数据库的效率,缩短查询时间,水平拆分的工作已经必不可免。 水平拆分带来的问题 而水平拆分必然会带来一些问题,例如原本依赖于数据库自增 id 的主键在分库的场景下,多个分库下 id 做不到全局唯一;引入了分布式事务的问题,如果同一个逻辑事务里,涉及的数据跨多个数据库实例,本地事务将不生效;需要将原本的源库做拆分...

  • go实现压测工具【单台机器100w连接压测实战】

    本文介绍压测是什么,解释压测的专属名词,教大家如何压测。介绍市面上的常见压测工具(ab、locust、Jmeter、go实现的压测工具、云压测),对比这些压测工具,教大家如何选择一款适合自己的压测工具,本文还有两个压测实战项目: - 单台机器对HTTP短连接 QPS 1W+ 的压测实战 - 单台机器100W长连接的压测实战 ## 目录 - 1、项目说明 - 1.1 go-stress-testing - 1.2 项目体验 - 2、压测 - 2.1 ...

  • golang-微服务micro初体验

    什么是微服务? 一种软件体系结构模式,用于将大型单块应用程序分解为更小、可管理的独立服务,这些服务通过语言无关协议进行通信,每个服务的重点做好一件事 微服务的概念并不新鲜,这是对服务导向架构的重新构想,但其方法更整体地与unix进程和管道保持一致。 微服务架构的理念: 服务很小 - 细粒度作为单一的商业目的类似于unix哲学“做一件事,做得好” 组织文化应该包含部署和测试的自动化。这减轻了管理和运营的负担 文化和设计原则应该包含失败和错误,类似于反脆弱系统。 好处: 更容易扩展开发 - 团队围绕...

  • 如何在 Golang API 中避免内存泄漏?

    关注公众号:JongSunShine 获取更多资料 建议你在将Golang API投入生成之前阅读此文,此文是基于真实的线上问题修复经历,如有巧合,纯属踩雷! 几个星期前,在修复我们的主服务器的漏洞时,我们尝试了很多方法来调试和修复它,因为它已经投入生产几个星期了。 但是我们总是需要通过我们的自动缩放机制来缓解,使其看起来似乎一切正常。直到后来我们才明白,这是coding中出现了问题。01 架构 我们在整个系统架构中使用了微服务模式。 有一个网关 API (我们称之为主 API )为我们的用户(...

  • golang获取goroutine ID

    golang本身不提供获取goroutineID的接口,如果要获取goroutineID可以使用下面的方法 package main import ( "bytes" "fmt" "runtime" "strconv" ) func main() { fmt.Printf("goroutine ID is:%d\n", getGID()) } func getGID() uint64 { b := make([]byte, 64) b = b[:runtime.Stack(b, false)] ...

  • 使用 Go Modules(模块)进行依赖项迁移

    ## 介绍 本篇文章是 Go Modules 系列文章的第 2 部分。第 1 部分请参阅 [Go Modules 的使用方法(中文翻译版)](https://studygolang.com/articles/19334) [Using Go Modules(EN)](https://blog.golang.org/using-go-modules) Go 项目使用各种各样的依赖关系管理策略,像 `dep` 和 `glide` 这样的第三方依赖项[vendor](https...

  • 压测工具如何选择? ab、locust、Jmeter、go压测工具【单台机器100w连接压测实战】

    本文介绍压测是什么,解释压测的专属名词,教大家如何压测。介绍市面上的常见压测工具(ab、locust、Jmeter、go实现的压测工具、云压测),对比这些压测工具,教大家如何选择一款适合自己的压测工具,本文还有两个压测实战项目: 单台机器对HTTP短连接 QPS 1W+ 的压测实战 单台机器100W长连接的压测实战 目录 1、项目说明 1.1 go-stress-testing 1.2 项目体验 2、压测 2.1 压测是什么 2.2 为什么要压测 2.3 压测名词解释 2.3.1 压测类型解释 ...

  • golang微服务框架go-micro 入门教程1.1 10分钟搭建go-micro开发环境

    >微服务的本质是让专业的人做专业的事情,做出更好的东西。 `golang`具备高并发,静态编译等特性,在性能、安全等方面具备非常大的优势。`go-micro`是基于`golang`的微服务编程框架,`go-micro`操作简单、编码高效、功能强大。但是网络上资料偏少,本系列文章定位最简单最容易上手的`go-micro`入门教程,所有案列来自实操,而非网络上的复制粘贴。 >本章节的目的是让大家最快速搭建好`go-micro`环境 |软件|环境| |----|----| |操作系统...

  • golang微服务框架go-micro 入门笔记1.搭建 go-micro环境

    微服务的本质是让专业的人做专业的事情,做更美好的自己。 golang具备高并发,静态编译等特性,在性能、安全等方面具备非常大的优势。go-micro是基于golang的微服务编程框架,go-micro操作简单、编码高效、功能强大。但是网络上资料偏少,本系列文章的定位是成为最简单最容易上手的go-micro入门文章,所有案列来自实操,杜绝复制粘贴。 本章节的目的是让大家最快速搭建好go-micro环境 软件 环境 操作系统 win10 golang go 12.7/AMD64 micro micr...

  • 使用Golang的Gin框架和vue编写web应用

    背景: 之前使用Golang的Gin框架进行一些运维内部后端的API接口开发,对外提供提供json类型的数据响应,但是该种方式在浏览器访问数据时数据格式不友好(由于是API接口,一般需要使用postman之类的工具来验证接口返回数据),后来尝试了使用Golang的template模板来结合html进行数据渲染,但也发现比较缺乏美感。之后决定使用前端框架来渲染后端数据,由于vue框架的各种优势,比如简单、数据的双向绑定等等好处,决定使用vue框架来开启我的前端之旅。接下来简单来讲解下使用Golan...

  • 单机百万并发,golang 50行代码

    本文首先介绍单机百万并发的测试方法和测试结果,然后分析go语言50行代码实现的单机百万并发网络服务器背后的秘密 组网 采用6台2核8G内存的云主机作为client 采用1台4核16G内存的云主机作为server 组网图 client端设置 设置系统打开的最大文件数为20万 ulimit -n 200000 修改端口可用范围为1024到65535 echo 1024 65535 > /proc/sys/net/ipv4/ip_local_port_range 单台client虚机建立18万连接 配...

  • 源码剖析golang中sync.Mutex

    go语言以并发作为其特性之一,并发必然会带来对于资源的竞争,这时候我们就需要使用go提供的sync.Mutex这把互斥锁来保证临界资源的访问互斥。 既然经常会用这把锁,那么了解一下其内部实现,就能了解这把锁适用什么场景,特性如何了。 引子 在我第一次看这段代码的时候,感觉真的是惊为天人,特别是整个Mutex只用到了两个私有字段,以及一次CAS就加锁的过程,这其中设计以及编程的理念真的让我感觉自愧不如。 在看sync.Mutex的代码的时候,一定要记住,同时会有多个goroutine会来要这把锁,...

  • API接口测试工具Restbird项目文件管理

    本文你可以了解到项目文件管理项目文件管理我们使用下面命令行管理restbird容器:docker run -ti -p {host-port}:8080 -v {path-to-project}:/data/restbird restbird/rest你首先需要创建项目文件夹,按上述命令行映射到restbird container。其中path-to-project是你创建项目文件夹的文件路径。所有的项目文件将存储到此文件中。你可以使用git、svn或者其他版本控制工具管理项目文件。一旦rest...

  • 【Golang】go get GitHub私有仓库

    go get GitHub私有仓库 go get github.com/user/project 命令内部使用 https://github.com/ git clone命令,默认只支持公有仓库,不支持私有仓库。如需要让go get支持私有仓库,则须按如下操作,使https://github.com/转为GitHub的Token访问: 1、前往 https://github.com/settings/tokens/new 产生一个Token,注意该Token必须包含repo权限。 2、执行命令 ...

  • 用 let's Encrypt 实现 HTTPS 示例( fasthttp 与net/http)

    [摘要] let's Encrypt 是一个免费提供 HTTPS 的签名服务, 这里提供一个示例,用 [certmagic](https://github.com/mholt/certmagic) 实现 fasthttp 与 net/http 上支持 HTTPS <!--more--> ## 0. 基本配置 我的域名, 包括 tsingson.io 与 www.tsingson.io , 在 DNS 上加上 A 记录, 指向我的服务器 IP 为了...

  • Go gcache 源码分析(图解)

    概述 gcache是一个用go实现的并发安全的本地缓存库。他可以实现如下功能: 指定缓存的的大小,初始化之时为cache设置size大小。 支持多种缓存的策略:Simple、LRU、LFU、ARC Simple:最普通的缓存策略,根据先存入的先淘汰。 LUR:Least Recently Used,意思是最近最少使用。LRU Cache 的替换原则就是将最近最少使用的内容替换掉。 LFU:Least Frequently Used ,意思是最近最不常用。LFU Cache先淘汰一定时间内被访问次...

  • Go 编程: 那些奇怪的注释

    自从上篇总结了一下Go 编程: 交叉编译 vs 条件编译之后,觉得有必要对于类似条件编译标签此类的特殊注释做一次简单收集。 1. 常规注释 每种开发语言都有自己的注释语法和格式,也大多类似。 Go 语言和市面上其它多种高级语言的注释语法也类似,主要有以下两种语法格式: 注释行 以符合 // 开头 注释块 以符号 /* 注释内容 */ 包括 通常情况下, 对外公开的包、函数、常量、变量均需要进行注释。代码是否注释完全,可以通过lint工具进行审查。不了解的话,可以参考像 Awesome-Go 一样...

  • 后端架构设计,如何扛住100亿次请求?

    1. 前言前几天,偶然看到了 《扛住100亿次请求——如何做一个“有把握”的春晚红包系统”》一文,看完以后,感慨良多,收益很多。正所谓他山之石,可以攻玉,虽然此文发表于2015年,我看到时已经过去良久,但是其中的思想仍然是可以为很多后端设计借鉴。同时作为一微信后端工程师,看完以后又会思考,学习了这样的文章以后,是否能给自己的工作带来一些实际的经验呢?所谓纸上得来终觉浅,绝知此事要躬行,能否自己实践一下100亿次红包请求呢?否则读完以后脑子里能剩下的东西 不过就是100亿 1400万QPS整流 这...

  • 如何用 Go 语言实现正向代理

    正向代理是处理一组内网客户端发往外部机器的网络请求的一种代理方式。 实际上,正向代理是你的应用和你所要连接的服务器之间的中间人。它在 HTTP(S) 协议上起作用,并且被部署在网络设施的边缘。 你通常可以在大型组织或大学中见到正向代理,它被用来进行授权管理或网络安全方面的控制。 我发现在使用容器或者动态的云环境工作时,正向代理很有用,因为你会面临一组服务器和外部网络的通信问题。 如果你在 AWS、AZure 之类的动态环境下工作,你会拥有一批数量不定的服务器和一批数量不定...

  • Go语言中的微服务

    # Go语言中的微服务 ## 摘要 我最近在墨尔本 Golang 聚会上就如何开发微服务和框架做了一次演讲。在本文中,我将与您分享我的想法(此外,它对我来说是一个很好的复习)。 在这里,我要介绍以下框架: * [Go Micro](https://micro.mu/) * [Go Kit](https://gokit.io/) * [Gizmo](https://github.com/NYTimes/gizmo) * [Kite](https://github.co...

  • Go组件学习——cron定时器

    1 前言 转到Go已经将近三个月,写业务代码又找到了属于Go的条件反射了。 后置声明和多参数返回这些Go风格代码写起来也不会那么蹩脚,甚至还有点小适应~ 反而,前几天在写Java的时候,发现Java怎么启动这么慢,Java怎么能够容忍这些用不到的代码还理直气壮的躺在那……等等,这些话在哪听过类似的??? “Go为什么要后置声明,多别扭啊” “Go里面为啥要定义这么多的struct,看的头晕” …… 其实,没有最好的语言,只有最适合的。 前面《Go语言学习》系列主要介绍了一些Go的基础知识和相较于...

  • 深入 Go 并发模型:Context

    介绍 在Go服务器中,每个传入请求都在其自己的goroutine中处理。 请求处理程序通常会启动其他goroutine来访问后端,例如数据库和RPC服务。 处理请求的goroutine集合通常需要访问特定于请求的值,例如最终用户的身份,授权令牌和请求的截止日期。 当请求被取消或超时时,处理该请求的所有goroutine都应该快速退出,以便系统可以回收他们正在使用的任何资源。 Context是专门用来简化对于处理单个请求,多个goroutine之间数据共享、取消信号、超时处理等相关操作。翻译自 G...

  • 使用 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系统一般对性能要求高,不推荐使用文本传输。 #### 用消息的头字节标识消息内容的长度 可以使用二进制传输,效率高,推荐。下面看看怎么...