Gin源码剖析

## 介绍 Gin 是一个 Golang 写的 web 框架,具有高性能的优点,基于 httprouter,它提供了类似martini但更好性能(路由性能约快40倍)的API服务。官方地址:https://github.com/gin-gonic/gin。 ## 使用 在项目中使用Gin也极其简单 1. 下载gin: go get -u -v github.com/gin-gonic/gin 2. import中引入"github.com/gin-gonic/gin...阅读全文

Go语言中文网 2020-05-24 23:20:45 shidawuhen

Go 语言进阶学习路线图

友情提示:此篇文章大约需要阅读 0分钟49秒,不足之处请多指教,感谢你的阅读。订阅本站 此文章首发于 Debug客栈 |https://www.debuginn.cn 从去年开始接触学习 Go 语言,一直没有一个明确的学习方向,只是一贯的跟着视频学习,虽自己做了衍生开发的项目,但是使用的技术也是 Go 语言中的冰山一角,近期在 Github 中找到了一个 Star 比较高的 Go语言学习成长路线图,才发现自己所学的仅仅是入门而已,若想得到一个体系化的进步,在最学习的过程中要追求的是高效率的量变,...阅读全文

Segmentfault 2020-05-28 14:32:34 Meng小羽

带你学够浪:Go语言基础系列 - 8分钟学基础语法

文章每周持续更新,原创不易,「三连」让更多人看到是对我最大的肯定。可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 对于一般的语言使用者来说 ,20% 的语言特性就能够满足 80% 的使用需求,剩下在使用中掌握。 基于这一理论,Go 基础系列的文章不会刻意追求面面俱到,但该有知识点都会覆盖,目的是带你快跑赶上 Golang 这趟新车。 Hurry up , Let's go ! 一个好消息一个坏消息一个潜规则 Go 的语法类似 C 语言,你是从 C/C++ 语言过来...阅读全文

掘金 2020年05月24日 柠檬橙

带你学够浪:Go语言基础系列 - 基础语法

对于一般的语言使用者来说 ,20% 的语言特性就能够满足 80% 的使用需求,剩下在使用中掌握。 基于这一理论,Go 基础系列的文章不会刻意追求面面俱到,但该有知识点都会覆盖,目的是带你快跑赶上 Golang 这趟新车。 Hurry up , Let's go ! 一个好消息一个坏消息一个潜规则 Go 的语法类似 C 语言,你是从 C/C++ 语言过来的话学习成本很低,其他语言过来甚至没有编程基础也没关系,这门语言入门很轻松。 好消息是你的键盘得救了,在 Go 的世界里不用在每个语句后面加分号了...阅读全文

Segmentfault 2020-05-28 13:32:37 柠檬橙

基于Docker的Golang交叉编译

前言 首先Go本身在交叉编译方法十分强大,这里就不再赘述了,有需要的同学可以参考《Golang交叉编译各个平台的二进制文件》。虽然自带的交叉编译已足够强大,并且能满足大部分的使用场景,但还是有一个坑人的地方就是当源代码中包含CGO代码时,默认交叉编译就会出错,具体可以参考《CGO_ENABLED环境变量对Go静态编译机制的影响》。实际上有一种可以一劳永逸地解决,并保证线下编译与线上部署环境一致的项目构建方法,那就是基于Docker的“交叉编译方案”。 Docker是近年来十分流行的Linux容器...阅读全文

掘金 2020年05月23日 Xelawk

Dig101-Go之如何在函数内修改指针

Dig101: dig more, simplified more and know more 今天来看一个小问题:如何在函数内部修改一个指针(参数或接收者),使其值的改变能反映在函数外部? 直接上代码,这样可以么? type ArgType struct { A string b int } func modifyPointerArg1(arg *ArgType) { arg = &ArgType{"arg1", 1} fmt.Println("inside modifyPointerArg1...阅读全文

掘金 2020年05月23日 newbmiao

viper配置框架-支持zookeeper的读取和监听

viper作为配置框架,其功能非常的强大,我们没有理由不去了解一下。我们先看官网对它的功能简介: viper是完整配置解决方案,他可以处理所有类型和格式的配置文件,他有如下功能: 设置默认配置 支持读取 JSON TOML YAML HCL 和 Java 属性配置文件 监听配置文件变化,实时读取读取配置文件内容 读取环境变量值 读取远程配置系统 (etcd Consul) 和监控配置变化 读取命令 Flag 值 读取 buffer 值 读取确切值 乍一看,未免有相见恨晚之感,可仔细一想,不免脑袋...阅读全文

掘金 2020年05月23日 修华师

Golang问题点(三) - Context的问题点

Go的标准库 context 在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理。请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务。用来处理一个请求的 goroutine 通常需要访问一些与请求特定的数据,比如终端用户的身份认证信息、验证相关的token、请求的截止时间。 当一个请求被取消或超时时,所有用来处理该请求的 goroutine 都应该迅速退出,然后系统才能释放这些 goroutine 占用的资源。 那...阅读全文

简书 2020-05-23 09:32:56 董小贱

learn go with tests 学习笔记(一) hello world

引言 终于开始学习golang细节了,此系列笔记旨在记录学习路上遇到的一些坑,还有一些感觉需要特别注意的知识点 环境准备 IDE:goland go version: go version go1.14.1 darwin/amd64 遇到问题 (一)运行 go test 报错 go: cannot find main module; see 'go help modules' 问题分析:其根本原因是我使用了go mod进行依赖管理,然而使用项目根目录没有go.mod文件 解决办法:添加go.mo...阅读全文

简书 2020-05-23 09:32:56 硌手小石头

[2020年面试题-PHP 与 golang] .Go 和 PHP 在运行的时候有什么区别和优势

原文链接分享:[分享] 大环境下瑟瑟发抖辞职的第二天,拿了两个 offer面试题解析看你简历里也有用过 Go,Go 和 PHP 在运行的时候有什么区别和优势?题主原回答:PHP 每个请求进来时都会创建 fpm-worker 进程,从而导致系统并发高时 CPU 会产生频繁创建进程的开销,而 Go 不会。解析回答:PHP 每个请求进来时都会创建 fpm-worker 进程补充下,这里 php 请求进来就会 由 PHP - FPM(php-fpm 是 php-cgi 的进程管理器)创建一个 PHP-C...阅读全文

简书 2020-05-23 09:32:55 八重樱勿忘

多少人去字节跳动面试挂在了这道题上...

原题:给你一个装满水的 8 升满壶和两个分别是 5 升、3 升的空壶,请想个优雅的办法,使得其中一个水壶恰好装 4 升水,每一步的操作只能是倒空或倒满。 image 理解了这个题目的意思之后,我们的第一个方法肯定就是使用强大的脑力来进行暴力破解法,瓶子里的水在我们的脑子里颠三倒四,但是脑子有可能没那么清晰,想了几步之后就开始出现记忆错乱,然后就不得不开始慢慢重播。 甚至到最后好不容易搞定了,但是怎么走过来的步骤又给忘记的一干二净 —— 智商好像受到了点小小的侮辱! 这道题其实有一道非常科学的解决...阅读全文

简书 2020-05-23 09:32:54 Android高级架构

Golang 多版本管理工具gvm

Golang 多版本管理工具gvm gvm,即 Go Version Manager,Go 版本管理器,使用 shell 脚本开发,它可以非常轻量的切换 Go 版本。对比其他语言,通常也有类似的工具,如 NodeJS 的 NVM,Python 的 pyenv 等。在使用方法上和 Python 的多版本管理工具 pyenv 非常类似。 其实不借助类似的版本管理工具安装多个版本 Go 也是可以自己手动实现的,做法很简单,就是下载不同的 Golang 安装包,然后放置到独立的目录,使用时将 GOROO...阅读全文

简书 2020-05-23 09:32:53 Felix_Shang

Cookie重新认知2,跨域Cookie

距离上一次cookie学习快两个月了,这几天想给自己的网站写一个用户系统,或者说权限系统。因为后端是使用Golang的net/http标准库实现的,所以说好多东西都要自己实现。所以从新来回顾下cookie机制好方便对前后端状态管理和权限验证有更为深入得了解。 cookie的收发机制在认知1中做了详细得介绍并附有实验。本次记录的主要是关于Ajax跨域时遇到的一些cookie相关的问题。 首先当Ajax请求发生跨域时默认是不会携带cookie的,如果想要携带cookie需要手动为Ajax指定with...阅读全文

简书 2020-05-23 09:32:51 拖延症专家

GO在并发时使用math/rand包时遇到的坑

起因 最近在用go写一个raytracing光线追踪器,光线追踪针对每一个光线进行跟踪并计算最终结果,且每个光线之间互不干扰,非常适合利用并行计算进行计算时间的优化。 问题 然而当我将计算并行化之后却发现并行计算的时间居然远远超出单线程的计算时间,十分怪异。一开始认为是开启太多goroutine导致调度负载过高而拖慢计算,排查后发现显然不是。 遂利用go自带的pprof工具采集cpu信息进行分析,发现sync.(*Mutex).lockSlow消耗了大量的时间,在排除了本身程序架构上的锁问题之后...阅读全文

简书 2020-05-23 09:32:49 linkwwj

软件开发

大家常规的认知是,Go 程序中声明的类型越多,生成的二进制文件就越大。这个符合直觉,毕竟如果你写的代码不去操作定义的类型,那么定义一堆类型就没有意义了。然而,链接器的部分工作就是检测没有被程序引用的函数(比如说它们是一个库的一部分,其中只有一个子集的功能被使用),然后把它们从最后的编译产出中删除。常言道,“类型越多,二进制文件越大”,对于多数 Go 程序还是正确的。 本文中我会深入讲解在 Go 程序的上下文中“相等”的意义,以及为什么像这样的修改会对 Go 程序的大小有重大的影响。 定义两个值相...阅读全文

通过禁止比较让 Go 二进制文件变小 2020-05-22 10:17 通过禁止比较让 Go 二进制文 等

我可能并不会使用golang goroutine

有关goroutine的问题,大多数集中在 它跟线程有啥区别?原理是啥? 都说他好,他好在哪里? 使用上面有啥注意的? 等等,或许我们还有更多疑问,但是先从最基础的开始吧 package main import ( "fmt" ) func worker(stop chan bool) { for i:=0;i<10;i++ { fmt.Println("干活....") } stop <- true } func main() { stop := make(chan bool) go work...阅读全文

掘金 2020年05月22日 第八共同体

go-micro的etcd服务注册管理界面使用方法

我们在使用consul时,consul提供了管理界面,可很直观的看到我们注册到consul的服务及健康状况。 etcd并未提供此功能,但是我们可以使用go-micro提供的一个简易界面查看我们注册到etcd中的服务 本文是基于【docker+etcd+go-micro api网关的搭建及使用】:https://www.jianshu.com/p/13d1df6e6731,这篇文章的环境基础来实现的,没有搭建docker+etcd+go-micro api网关的,可以按照上面的链接搭建一遍。 ...阅读全文

Go语言中文网 2020-05-22 16:43:23 kukayou

docker+etcd+go-micro api网关的搭建及使用

在我们使用go-micro框架时,会用到其api网关功能。 本文以etcd作为服务注册和发现工具,实现通过api网关和etcd实现服务间的调用 本文以下内容为基础,未看过的请移步: 【ubuntu+docker搭建etcd集群】:https://www.jianshu.com/p/ec0e4911236d 【go-micro+gin+etcd微服务实战之服务注册与发现】:https://www.jianshu.com/p/1e14a5b0a9db 现默认已经将etcd集群启动,且已...阅读全文

Go语言中文网 2020-05-22 16:42:00 kukayou

go-micro+gin+etcd微服务实战之服务注册与发现

在构建微服务时,使用服务发现可以减少配置的复杂性,本文以go-micro为微服务框架,使用etcd作为服务发现服务,使用gin开发golang服务。 使用gin 的原因是gin能够很好的和go-micro进行集成。 本文主要介绍服务注册和发现的实现 关于如何搭建etcd服务可以移步:https://www.jianshu.com/p/ec0e4911236d 本文默认以搭建好了etcd服务,服务的地址是:192.168.109.131:12379 如果你搭建好了自己的e...阅读全文

Go语言中文网 2020-05-22 16:41:28 kukayou

ubuntu+docker搭建etcd集群

本文基于compose管理镜像,对此不熟悉的,可以先了解下如何使用。 ####安装compose 下载compose,使用下面的指令下载compose ``` sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose ``` 将可执行权限应用于二进制文件...阅读全文

Go语言中文网 2020-05-22 16:40:28 kukayou