atomic
概述为了保证并发安全,除了使用临界区之外,还可以使用原子操作。顾名思义这类操作满足原子性,其执行过程不能被中断,这也就保证了同一时刻一个线程的执行不会被其他线程中断,也保证了多线程下数据操作的一致性。 在atomic包中对几种基础类型提供了原子操作,包括int32,int64,uint32,uint64,uintptr,unsafe.Pointer。对于每一种类型,提供了五类原子操作分别是 Add, 增加和减少 CompareAndSwap, 比较并交换 Swap, 交换 Load , 读取 Store, 存储 具体函数名由原子操作名和类型关键字组成,例如对于int32的Add操作,函数名为AddInt32,其他函数名以此类推,后文中仅以int32类型系列函数为例进行说明,其他类型函数功能类似。 AddInt32AddInt32可以实现对元素的原子增加或减少,其函数定义如下,函数接收两个参数,分别是需要修改的变量的地址和修改的差值,函数会直接在传递的地址上进行修改操作,此外函数会返回修改之后的新值:...
sync
概述sync包对并发和同步机制进行了实现,但显然并发编程这样一个话题过于庞大,无法在一篇博客里面详细展开,所以本文的重点放在sync包的使用。 不过这里首先对并发的背景进行简单的介绍,在单线程的程序中,同一个时刻只存在一个线程对数据进行访问,访问永远是线性的,不需要额外的机制保障;但是当同时存在多个线程可能同时访问一个数据时,由于线程调度的特性,会带来难以预料的结果。试想如下代码会输出什么结果,正常情况会是3,但实际上可能的结果是2或者3,这是由于函数或者代码的运行没有原子性,比如在线程1执行Add1操作时被暂停了(已经读取data,还未写回),然后开始运行线程2,并读取数据,然后两个线程依次执行到结束,由于两个线程读取的值都是data=1,执行Add1后都得到2,而非3。 123456789101112131415161718import ( "fmt" "time")func Add1(data *int) { tmp = *data *data = tmp + 1}fu...
反射的简单定律
前言这篇文章大概2个月前就开始在边看边翻译了,可惜生了场病,然后不断地出问题,工作也没了,人比较焦虑。就耽搁了。 在我的初衷里,是准备对Go语言进行一个全面的系统的学习和研究的,但是目前看下来,是坚持不下去了。只得暂摆,不过这篇文章弄到一半放在这里,心里也是一个梗,就趁着最近的时间把它全部翻完,说实话这工作好累,一方面是英文的基础不扎实,再碰到大量的计算机术语,更是一道壁垒。不过总算也是坚持子下来,翻完之后,发现网上其实已经有别人做了同样的事情,撞车了。好在自己也算是学习一下知识,并不会觉得是无用功。 之后又花了一点时间,对照着别人的成果,将我自己的成果重新润了一下色,让句子读起来更通顺一点,并加了一些自己的理解。 应该说,这一篇是自己最用心翻译的文章,虽然说谈不上完美,算是对我Go语言学习(reflect部分)的一个总结。当然,这篇文章在整个Go的reflect领域里面,还是太浅,有兴趣可以看一下深入的知识。 Go语言反射之定律The Laws of Reflection介绍Introduction在计算机领域中,反射是一种主要通过types[类型],检查自身结构...
1-Docker入门教程
原文:《Docker 入门教程》——阮一峰 注意:根据评论描述 $ docker container ls 可以查看运行中的 docker 容器 ; $ docker container ls -l 表示查看最近创建的容器 ; 也有说使用 docker images 可以查看容器; 也有评论说官方推荐使用 docker ps 和 docker ps -a 查看容器; 2013 年发布至今, Docker 一直广受瞩目,被认为可能会改变软件行业。 但是,许多人并不清楚 Docker 到底是什么,要解决什么问题,好处又在哪里?本文就来详细解释,帮助大家理解它,还带有简单易懂的实例,教你如何将它用于日常开发。  .1 环境配置的难题软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来? 用户必须保证两件事:操作系统的设置,各种库和组件的安装。只有它们...
2-使用Docker部署Go Web应用
原文:《如何使用Docker部署Go Web应用》——李文周 其他相关参考: 《Docker 入门教程》——阮一峰 建议先看 阮一峰 老师的入门教程,先对 Docker 有一个基本了解,然后再来看本篇文章。 本文介绍了如何使用 Docker 以及 Docker Compose 部署我们的 Go Web 程序。 .1 为什么需要Docker?使用 Docker 的主要目标是 容器化。也就是为你的应用程序提供一致的环境,而不依赖于它运行的主机。 想象一下你是否也会遇到下面这个场景:你在本地开发了你的应用程序,它很可能有很多的依赖环境或包,甚至对依赖的具体版本都有严格的要求,当开发过程完成后,你希望将应用程序部署到 web 服务器。这个时候你必须确保所有依赖项都安装正确并且版本也完全相同,否则应用程序可能会崩溃并无法运行。如果你想在另一个 web 服务器上也部署该应用程序,那么你必须从头开始重复这个过程。这种场景就是 Docker 发挥作用的地方。 对于运行我们应用程序的主机,不管是笔记本电脑还是 web 服务器,我们唯一需要做的就是运行一个 docker 容器平台。然后,你就不...
01-框架安装
概述看下 Gin 框架的官方介绍: Gin 是一个用 Go (Golang) 编写的 web 框架。 它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httprouter,速度提高了近 40 倍。 如果你是性能和高效的追求者, 你会爱上 Gin。 是的,就是用 Gin 来写 API 接口。 Gin 安装必须要先安装 Go,Go 的安装可以参考:Go - 环境安装。 框架安装可以参考官网: https://gin-gonic.com/zh-cn/docs/quickstart/ 我在安装时,用的是 dep 安装,给大家分享下。 dep 是啥 ? 它是 Golang 官方依赖管理工具,可以认为它与 PHP 中的 composer 类似。 在这就不多做介绍了,可以自己去了解,安装也比较简单。 我本机是 Mac,安装只需一个命令: 1brew install dep 咱们接下来创建一个新项目:ginDemo。 在 ginDemo 目录下执行: 1dep init 执行完毕,会生成如下三个文件: 1234├─ ginDemo│ ├─ vendor│ ├─...
1-etcd快速入门
原文: 《etcd 快速入门》 .1 认识etcd.1.1 etcd 概念从哪里说起呢?官网第一个页面,有那么一句话:”A distributed, reliable key-value store for the most critical data of a distributed system”。也就是说 etcd 是一个分布式、可靠 key-value 存储的分布式系统。当然,它不仅仅用于存储,还提供共享配置及服务发现。 .1.2 etcd vs Zookeeper提供配置共享和服务发现的系统比较多,其中最为大家熟知的是 Zookeeper,而 etcd 可以算得上是后起之秀了。在项目实现、一致性协议易理解性、运维、安全等多个维度上,etcd 相比 zookeeper 都占据优势。 本文选取 Zookeeper 作为典型代表与 etcd 进行比较,而不考虑 Consul 项目作为比较对象,因为 Consul 的可靠性和稳定性还需要时间来验证(项目发起方自身服务并未使用 Consul,自己都不用)。 一致性协议: etcd 使用 Raft 协议,Zookeeper 使用 ...
02-路由配置
概述这篇文章分享 Gin 的路由配置,主要包含的功能点如下: 实现了,路由分组 v1版本、v2版本。 实现了,生成签名和验证验证。 实现了,在配置文件中读取配置。 路由配置比如我们的接口地址是这样的: /v1/product/add /v1/member/add /v2/product/add /v2/member/add 假设需求是这样的,接口支持多种请求方式,v1 不需签名验证,v2 需要签名验证,路由文件应该这样写: 123456789101112131415161718192021222324252627282930313233343536373839404142package routerimport ( "ginDemo/common" "ginDemo/controller/v1" "ginDemo/controller/v2" "github.com/gin-gonic/gin" "net/url" "strconv")func Init...
03-日志记录
概述上篇文章分享了 Gin 框架的路由配置,这篇文章分享日志记录。 查了很多资料,Go 的日志记录用的最多的还是 github.com/sirupsen/logrus。 Logrus is a structured logger for Go (golang), completely API compatible with the standard library logger. Gin 框架的日志默认只会在控制台输出,咱们利用 Logrus 封装一个中间件,将日志记录到文件中。 这篇文章就是学习和使用 Logrus 。 日志格式比如,我们约定日志格式为 Text,包含字段如下: 请求时间、日志级别、状态码、执行时间、请求IP、请求方式、请求路由。 接下来,咱们利用 Logrus 实现它。 Logrus 使用用 dep 方式进行安装。 在 Gopkg.toml 文件新增: 123[[constraint]] name = "github.com/sirupsen/logrus" version = "1.4.2" 在项目中导入: ...












