使用vendor管理Golang项目依赖

http://www.tuicool.com/articles/NjMzIbJ 我们在项目中除了大量的使用Python外,也大量的使用了Golang构建高效基础运行服务。在使用Golang过程中,我们发现Golang程序缺少依赖库版本功能是一个非常令人头大的问题:某些依赖在某个commit之后发生了API变更之后,如果不修改代码很难兼容,然而开发者之间很有可能因为参与的时间不同,导致执行 go get 命令获取的版本不同,而导致在不同电脑上出现编译不通过问题。同时,在多个程序中,如果使用的com...阅读全文

阅读:18020 评论:1

Golang浮点型的默认舍入规则——四舍六入五成双

四舍六入五成双是一种比较精确比较科学的计数保留法,是一种数字修约规则,又名银行家舍入法。它比通常用的四舍五入法更加精确。 具体规则: 被修约的数字小于5时,该数字舍去; 被修约的数字大于5时,则进位; 被修约的数字等于5时,要看5前面的数字,若是奇数则进位,若是偶数则将5舍掉,即修约后末尾数字都成为偶数;若5的后面还有不为“0”的任何数,则此时无论5的前面是奇数还是偶数,均应进位。 助记口诀: 四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一 Golang中浮点型默...阅读全文

2016/09/03 00:06 henrylee2cn
阅读:5490 评论:0

Golang中的正则表达式

Golang中的正则表达式 用法: 单一: . 匹配任意一个字符,如果设置 s = true,则可以匹配换行符 [字符类] 匹配“字符类”中的一个字符,“字符类”见后面的说明 [^字符类] 匹配“字符类”外的一个字符,“字符类”见后面的说明 \小写Perl标记 匹配“Perl类”中的一个字符,“Perl类”见后面的说明 \大写Perl标记 匹配“Perl类”外的一个字符,“Perl类”见后面的说明 [:ASCII类名:] 匹配“ASCII类”中的一个字符,“ASCII类”见后面的说明 [:^AS...阅读全文

阅读:26846 评论:0

Go 记录日志——log包

Golang's log模块主要提供了3类接口。分别是 “Print 、Panic 、Fatal ”,对每一类接口其提供了3中调用方式,分别是 "Xxxx 、 Xxxxln 、Xxxxf",基本和fmt中的相关函数类似,下面是一个Print的示例: package main import ( "log" ) func main(){ arr := []int {2,3} log.Print("Print array ",arr,"\n") log.Println("Println array",...阅读全文

2016-12-15 21:00:03 吃一堑消化不良
阅读:32582 评论:0

高性能的消息框架 go-disruptor

Java程序员都知道,Disruptor是一个高性能的线程间通信的框架,即在同一个JVM进程中的多线程间消息传递,由LMAX开发。 Disruptor性能是如此之高,LMAX利用它可以处理每秒6百万订单,用1微秒的延迟获得吞吐量为100K+。那么Go语言生态圈中有没有这样的库呢? go-disruptor就是对Java Disruptor的移植,它也提供了与Java Disruptor类似的API设计,使用起来也算不上麻烦。 至于性能呢,下面就会介绍,这也是本文的重点。 因为Disruptor的...阅读全文

2016年07月22日 smallnest
阅读:3691 评论:1

go微服务

go-kit 入门 1. microservice Go-Kit go kit 是一个分布式的开发工具集,在大型的组织(业务)中可以用来构建微服务。其解决了分布式系统中的大多数常见问题,因此,使用者可以将精力集中在业务逻辑上。 2. go-kit 组件介绍 2.1 Endpoint(端点) Go kit首先解决了RPC消息模式。其使用了一个抽象的 endpoint 来为每一个RPC建立模型。 endpoint通过被一个server进行实现(implement),或是被一个client调用。这是很...阅读全文

2017-03-28 17:00:32 backtrackx
阅读:10673 评论:0

golang make和new

Go语言中的内建函数new和make是两个用于内存分配的原语(allocation primitives)。对于初学者,这两者的区别也挺容易让人迷糊的。简单的说,new只分配内存,make用于slice,map,和channel的初始化。 1. new 这是一个用来分配内存的内建函数,但是与C++不一样的是,它并不初始化内存,只是将其置零。也就是说,new(T)会为T类型的新项目,分配被置零的存储,并且返回它的地址,一个类型为*T的值。在Go的术语中,其返回一个指向新分配的类型为T的指针,这个指...阅读全文

2017-04-10 21:00:46 杰克慢
阅读:1431 评论:0

突然发现一个很好用Golang的json库

json 我并不想解释json是什么。 库名 GJSON 点这里去star感谢小哥 下载 $ go get -u github.com/tidwall/gjson 与官方的json解析包有什么区别 官方的包,都是一整块数据一起 包装/解析。有如下数据 struct { str1 str2 } json :{str1:"xx",str2:"xx"} 如果要单独得到str1的话,很麻烦的。 官方给的demo package main import "github.com/tidwall/gjson"...阅读全文

2017.05.27 17:25 送你一碗大麦茶
阅读:20126 评论:0

服务器开发利器golang context用法详解

本文主要基于官方文档Go Concurrency Patterns: Context以及视频Advanced Go Concurrency Patterns的学习而得。 背景 在go服务器中,对于每个请求的request都是在单独的goroutine中进行的,处理一个request也可能设计多个goroutine之间的交互, 使用context可以使开发者方便的在这些goroutine里传递request相关的数据、取消goroutine的signal或截止日期。 Context结构 // A ...阅读全文

2017.06.29 16:09* kingeasternsun
阅读:40096 评论:0

Go语言第一深坑 - interface 与 nil 的比较

# interface简介 Go语言以简单易上手而著称,它的语法非常简单,熟悉C++,Java的开发者只需要很短的时间就可以掌握Go语言的基本用法。 interface是Go语言里所提供的非常重要的特性。一个interface里可以定义一个或者多个函数,例如系统自带的io.ReadWriter的定义如下所示: ```go type ReadWriter interface { Read(b []byte) (n int, err error) Write(b []...阅读全文

2017-08-14 12:03:01 xiaonanln
阅读:15659 评论:17

golang 不翻墙安装golang.org/x/net

下载安装golang.org/x/net其实网上有很多的文章,但总的归来是有两种: 方法一: 为了使包的导入方式不变,我们需要在src目录下面构造目录结构 $mkdir -p $GOPATH/src/golang.org/x/ $cd $GOPATH/src/golang.org/x/ $git clone https://github.com/golang/net.git net $go install net 执行go install之后没有提示,就说明安装好了。 上面的方法参考:[当“go...阅读全文

2017.08.28 10:08 liuyg
阅读:23424 评论:3

Golang中Slice的append详解

在Golang语言中,数据类型不多,但是够用,开发项目过程中,Slice属于最常用的数据结构之一,对其原理理解不清楚,很容易会遗留bug,笔者查询了很多博客资料,对Slice的append原理进行一个总结,如果有写的不清楚不明白之处,请多多包涵,并予以指正。 package main import "fmt" func main(){ s := []int{5} s = append(s,7) fmt.Println("cap(s) =", cap(s), "ptr(s) =", &s[0]) ...阅读全文

2017-09-05 15:34:51 tomorrowwu
阅读:30812 评论:2

在Golang中各种永远阻塞的姿势

在Golang中各种永远阻塞的姿势 Go的运行时的当前设计,假定程序员自己负责检测何时终止一个goroutine以及何时终止该程序。 可以通过调用os.Exit或从main()函数的返回来以正常方式终止程序。而有时候我们需要的是使程序阻塞在这一行。 使用sync.WaitGroup 一直等待直到WaitGroup等于0 package main import "sync" func main() { var wg sync.WaitGroup wg.Add(1) wg.Wait() } 空sel...阅读全文

2018-05-19 21:03 sheepbao.github 等
阅读:9615 评论:0

理解 Go 标准库中的 atomic.Value 类型

作者:喵叔 原文:blog.betacat.io/post/golang… 在 Go 语言标准库中,sync/atomic包将底层硬件提供的原子操作封装成了 Go 的函数。但这些操作只支持几种基本数据类型,因此为了扩大原子操作的适用范围,Go 语言在 1.4 版本的时候向sync/atomic包中添加了一个新的类型Value。此类型的值相当于一个容器,可以被用来“原子地"存储(Store)和加载(Load)任意类型的值。 历史起源 我在golang-dev邮件列表中翻到了14年的这段讨论,有用户...阅读全文

阅读:8783 评论:2

Golang 中使用 Slice + 索引 Map 替代 Map 获得性能提升

起因 在我们的多个线上游戏项目中,很多模块和服务为了提高响应速度,都在内存中存放了大量的(缓存)数据以便获得最快的访问速度。 通常情况下,为了使用方便,使用了 go 自身的 map 作为存放容器。当有超过几十万 key 值,并且 map 的 value 是一个复杂的 struct 时,额外引入的 GC 开销是无法忽视的。在 cpu 使用统计图中,我们总是观测到较为规律的短时间峰值。这个峰值在使用 1.3 版本的 go 中显得特别突出(stop the world 问题)。后续版本 go gc 不...阅读全文

阅读:3854 评论:1

Protobuf 的 import 功能在 Go 项目中的实践

业务场景 我们会有这样的需求:在不同的文件夹中定义了不同的 proto 文件,这些不同的文件夹可能是一些不同的 gRPC 服务。因为不想重复定义某一个 message,所以其中一个服务可能会用到其他服务中定义的 message,那么这个时候就需要使用到 proto 文件的 import 功能。 接下来说说我在 Go 项目中使用 protobuf 的 import 时所遇到的坑。 案例 首先,我们来创建一个实验项目作为案例,便以说明,结构如下: 文件 go.mod 中声明了该项目模块名 modul...阅读全文

2020-01-03 08:32:32 Xavier
阅读:13217 评论:0

使用 bcrypt 函数生成密码

在几年前,相信很多和我一样的开发者都是使用 MD5 函数对用户的密码等敏感内容进行哈希化后存储到数据库中。即便是现在,还是很多开发者是这样的做法。 但很多事实告诉我们,如今用 MD5 函数生成的值在基于 彩虹表???? 和强大的 GPU 数亿次每秒的暴力破解下能较为轻松的破解。 所以对于需要保存用户密码等敏感信息的需求场景下,我们需要寻找另一种可靠安全的加密方式。 有关为什么 MD5 已经不可靠的原因可以参考我的另一篇文章《十万个为什么:别用 MD5 加密密码》。 当下推荐的方案是使用 bcry...阅读全文

2020-05-05 16:32:34 imxfly
阅读:2259 评论:0

golang之数据验证validator

前言 在web应用中经常会遇到数据验证问题,普通的验证方法比较繁琐,这里介绍一个使用比较多的包validator。 原理 将验证规则写在struct对字段tag里,再通过反射(reflect)获取struct的tag,实现数据验证。 安装 go get github.com/go-playground/validator/v10 示例 package main import ( "fmt" "github.com/go-playground/validator/v10" ) type Users...阅读全文

2020-05-07 12:32:34 guyan0319
阅读:3000 评论:1

Go mod使用指南

一、启用go mod go env -w GO111MODULE=on #开启 MODULE go env -w GOPROXY=https://goproxy.cn,https://goproxy.io,direct #默认值为https://proxy.golang.org,direct GO111MODULE可以设置为:off、on、auto(默认值),从GO111MODULE变量名可以看出,是Go1.11版本之后才出来有依赖包管理办法。 为off时,则不使用go mod,查找依赖包的顺序...阅读全文

2020-10-13 10:32:47 海阳之新
阅读:8579 评论:0