golang

[Golang] 使用dep

房东的猫 提交于 2019-11-28 12:57:10
原文引用 https://www.dazhuanlan.com/2019/08/25/5d62275d94dc6/ 之前的博文 [Golang]Win10下Glide的安装和使用 记录了对Glide的学习,本博将记录对Golang包管理工具dep的学习使用。 dep介绍 在2012年,go get成为获取依赖包的方式。dep的FAQ中有一段描述dep是否要取代go get的解答,一句话概括就是:依赖管理工具是为应用管理代码的,go get是为GOPATH管理代码的。go get仅仅支持获取master branch上的latest代码,没有指定version、branch或revision的能力。这不符合gopher对自己项目所依赖的第三方包受控的期望。 在2015年,Russ Cox在Go 1.5发布前期以一个experiment feature身份紧急加入vendor机制,vendor标准化了项目依赖的第三方库的存放位置,隔离不同项目依赖的同一个包的不同版本。 Golang的包管理一直没有官方统一的解决方案,因此也产生了很多非官方的包管理工具。这些工具很多都很不错,但是相互兼容性差。随着Go语言在全球范围内应用的愈加广泛,缺少官方包管理工具这一问题变得日益突出。2016年GopherCon大会后,由微服务框架go-kit作者Peter Bourgon牵头, 在Go官方的组织下

golang ---JSON-ITERATOR 使用

丶灬走出姿态 提交于 2019-11-28 12:32:33
jsoniter ( json-iterator )是一款快且灵活的 JSON 解析器 Jsoniter 是最快的 JSON 解析器。它最多能比普通的解析器快 10 倍之多, 独特的 iterator api 能够直接遍历 JSON ,极致性能! 0 内存分配!这样的 iterator 你绝对没有用过 github地址: https://github.com/json-iterator/go    获取: go get github.com/json-iterator/go    简单应用Marshal 由 json.Marshal(&data) 到 var json = jsoniter.ConfigCompatibleWithStandardLibrary json.Marshal(&data) 完整代码: package main import ( "encoding/json" "fmt" "os" "github.com/json-iterator/go" ) func main() { type ColorGroup struct { ID int Name string Colors []string } group := ColorGroup{ ID: 1, Name: "Reds", Colors: []string{"Crimson", "Red", "Ruby

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

ε祈祈猫儿з 提交于 2019-11-28 12:26:53
微服务的本质是让专业的人做专业的事情,做出更好的东西。 golang 具备高并发,静态编译等特性,在性能、安全等方面具备非常大的优势。 go-micro 是基于 golang 的微服务编程框架, go-micro 操作简单、编码高效、功能强大。但是网络上资料偏少,本系列文章定位最简单最容易上手的 go-micro 入门教程,所有案列来自实操,而非网络上的复制粘贴。 本章节的目的是让大家最快速搭建好 go-micro 环境 软件 环境 操作系统 win10 golang go 12.7/AMD64 micro micro version 1.8.4 consul consul 1.5.4 安装micro 最快速有效的方法是使用 GO1.11 以上版本并且设置环境变量 #linux 下 export GO111MODULE=on export GOPROXY=https://goproxy.io # windows下设置如下环境变量 setx GO111MODULE on setx GOPROXY https://goproxy.io # 使用如下指令安装 go get -u -v github.com/micro/micro go get -u -v github.com/micro/go-micro 如果没有git请自行安装git #下载地址 https://git-scm.com

Golang ---json解析

戏子无情 提交于 2019-11-28 12:26:16
golang官方为我们提供了标准的json解析库– encoding/json ,大部分情况下,使用它已经够用了。不过这个解析包有个很大的问题–性能。它不够快,如果我们开发高性能、高并发的网络服务就无法满足,这时就需要高性能的json解析库,目前性能比较高的有 json-iterator 和 easyjson 。 现在我们需要引进一个高性能的json解析库,这里以 json-iterator 为例,但是我们全部换掉又不放心,所以可以先小范围的测试下,这时候我们就需要两个解析库并存,那么这时候我们如何选择我们需要的解析库编译和运行呢? 解决上面问题的办法就是条件编译。Go语言为我们提供了基于tags的编译约束来解决这个问题。 统一JSON库 我们先举个例子看看结果。现在我们需要两个库并存,所以我们先得统一这两个库的用法(参考适配器模式),这里我们使用一个自定义的 json 包来适配 encoding/json 和 json-iterator 。 json/json.go // +build !jsoniter package json import ( "encoding/json" "fmt" ) func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) { fmt.Println("Use

Golang ---基准测试

こ雲淡風輕ζ 提交于 2019-11-28 12:17:17
什么是基准测试 基准测试,是一种测试代码性能的方法,比如你有多种不同的方案,都可以解决问题,那么到底是那种方案性能更好呢?这时候基准测试就派上用场了。 基准测试主要是通过测试CPU和内存的效率问题,来评估被测试代码的性能,进而找到更好的解决方案。比如链接池的数量不是越多越好,那么哪个值才是最优值呢,这就需要配合基准测试不断调优了。 如何编写基准测试 基准测试代码的编写和单元测试非常相似,它也有一定的规则,我们先看一个示例。 itoa_test.go package gotest import ( "fmt" "testing" ) //itoa_test.go func BenchmarkSprintf(b *testing.B) { num := 10 b.ResetTimer() for i := 0; i < b.N; i++ { fmt.Sprintf("%d", num) } }    这是一个基准测试的例子,从中我们可以看出以下规则: 基准测试的代码文件必须以 _test.go 结尾 基准测试的函数必须以 Benchmark 开头,必须是可导出的 基准测试函数必须接受一个指向Benchmark类型的指针作为唯一参数 基准测试函数不能有返回值 b.ResetTimer 是重置计时器,这样可以避免 for 循环之前的初始化代码的干扰 最后的for循环很重要

golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

孤街浪徒 提交于 2019-11-28 11:36:44
micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 主要作用 主要作用是为微服务提供http网关支持。假如后端服务名称为 go.micro.srv.hello ,提供 call 方法,则我们可用通过http协议来调用微服务。 curl http://127.0.0.0:8080/hello/call?name=123 micro api 指令全部参数如下 $micro api -h NAME: micro api - Run the api gateway USAGE: micro api [command options] [arguments...] OPTIONS: --address value Set the api address e.g 0.0.0.0:8080 [%MICRO_API_ADDRESS%] --handler value Specify the request handler

Golang ---testing包

*爱你&永不变心* 提交于 2019-11-28 09:49:31
golang自带了testing测试包,使用该包可以进行自动化的单元测试,输出结果验证,并且可以测试性能。 测试文件及目录 使用testing测试包的测试文件名称需要以 _test.go 结尾,并且该测试文件需要与待测试的文件置于 同一目录下 。比如如下目录: 这里需要测试的是service目录中各个文件中的函数,则在该目录中创建一个名为service_test.go的文件,即可在该文件中调用其他文件的函数进行测试。 测试函数 在_test.go中通过编写测试函数来进行测试。 首先引入testing包 import ( "testing" ) 对于测试函数,其命名需要 以“Test”开头 , 并且其后的字符串的第一个字符必须是大写,或者是数字 。如果没有按照此规则进行命名,则该函数在测试时不会被执行。 其次, 测试函数的参数必须为(t *testing.T) ,该参数包含有Log和Error等方法,用于输出测试结果,其中Log用于测试通过的情况,Error则用于测试出错的情况。 比如如下测试函数: func TestUserLogin_normal(t *testing.T) { err := User().Login("test1", "321") if err == nil { t.Log("Login test1 success") } else { t.Error(err)

Golang中defer的“坑”

被刻印的时光 ゝ 提交于 2019-11-28 08:39:31
1.defer的执行时机 defer的官方定义的为: 包裹defer的函数返回时 包裹defer的函数执行到末尾时 所在的goroutine发生panic时 2.defer 的执行顺序 defer 的执行顺序为LIFO原则,一段程序中后执行的defer代码段会在程序return的时候会优先执行。 defer在匿名返回值和明明返回值函数中的不同表现 。。。。。 来源: https://blog.csdn.net/wxs19970115/article/details/100046374

golang 数组range遍历的坑

不想你离开。 提交于 2019-11-28 07:16:03
项目里遇到一个问题 一个结构体数组需要修改其中一项的值,例如 type S struct { A int B string C bool } var tmp = []S{ {1, "a", false}, {2, "b", true}, } 当A等于1时,C赋值为true 我一开始是这么做的 for _, v:= range tmp { if v.A == 1 { v.C = true } } 但是打印之后值没有变,还是1, a, false,查资料之后才知道原来 遍历获取的是值的拷贝 要修改数组的值还是要用下标,应该这么做 for i := range tmp { if tmp[i].A == 1 { tmp[i].C = true } } 来源: https://blog.csdn.net/david___/article/details/100031054

golang 之 jwt-go

旧街凉风 提交于 2019-11-28 06:21:21
主要针对jwt-go快速生成token。和如何取进行介绍,具体详情还请查看 github.com/dgrijalva/jwt-go 生成token package main import ( "flag" "fmt" "github.com/dgrijalva/jwt-go" "github.com/micro/go-micro/config" "time" ) type Config struct { Version string Hello struct { Name string } Etcd struct { Addrs []string UserName string Password string } } type User struct { Name string `json:"name"` Password string `json:"password"` Token struct { AccessToken string `json:"accessToken"` ExpiresAt int64 `json:"expiresAt"` Timestamp int64 `json:"timestamp"` } } func main() { // 主要解析config.json配置文件,生成token没有用到 configFile := flag.String("f",