
GO学习总结
文章平均质量分 57
benben_2015
这个作者很懒,什么都没留下…
展开
-
Go 1.13版本介绍
在Go1.12版本发布了六个月之后,Go最新的版本1.13这个月发布了。相对于之前的版本,这个版本的变化主要体现在:工具链、运行时和标准库。维持Go第一版时的兼容承诺,所以这次发布更新不会影响到之前版本的使用。下面就捡一些常用内容的变化做简单介绍,如果想了解更详细的内容,请访问golang官网。工具链Modules变化环境变量GO111MODULE的默认值继续auto,但是只要当前目录包含...原创 2019-09-05 10:47:10 · 3011 阅读 · 0 评论 -
golang官方rpc包的使用
RPC(Remote Rrocedure Call,远程过程调用)是一个计算机通信协议。RPC协议假定某些传输协议的存在,如TCP和UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC采用C/S模式,请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠...原创 2019-04-18 17:42:46 · 2307 阅读 · 0 评论 -
golang读取EXIF orientation标记
在图片自适应旋转显示一文中,了解到相机拍摄的图片可能在显示的时候出现旋转问题,并且文中讲解了一个图片属性orientation。它用来标记摄像机相对于捕获场景的方向,一些图片显示设备就是依赖它进行旋转控制。因此对于软件来说,要想实现图片的旋转,首先需要获取这一标记值。下面是利用exif包进行的orientation标记读取:package mainimport ( "fmt" "git...原创 2019-04-16 13:19:46 · 3132 阅读 · 0 评论 -
byte数组转string
通常我们将一个[]byte类型或[]uint8类型的变量通过string()可以直接转化成一个字符串,例如:package mainimport "fmt"func main() { a := []byte{2, 3, 6, 2} fmt.Println("strA :", string(a)) //strA : ╗╚═╗}与期望得到的字符串"2362原创 2019-01-18 09:03:12 · 9546 阅读 · 0 评论 -
beego框架对运行异常的处理
运行时异常panic在通常情况下,函数向其调用方报告错误的方式都是返回一个error类型的值。但是当遇到致命错误的时候,很可能会使程序无法继续运行。Go推荐通过调用panic函数来报告致命错误,它会停止当前控制流程,并引发一个运行时恐慌。例如:package mainimport "errors"func main() { outerFunc()}func outerFunc...原创 2019-01-11 20:42:15 · 6127 阅读 · 0 评论 -
Go 对HTTP POST的支持
在net/http标准包的client.go文件中,Post方法使用POST请求方式访问指定的URL。下面是标准包中的定义,可以看到它是对DefaultClient.Post方法的包裹。如果你想使用自定义的headers,那么需要使用NewRequest和DefaultClient.Do方法。func Post(url, contentType string, body io.Reader) (...原创 2018-12-06 19:18:22 · 8741 阅读 · 0 评论 -
all goroutines are asleep - deadlock!
默认情况下,通信是同步且无缓冲的。这种特性导致通道的发送/接收操作,在对方准备好之前是阻塞的。对于同一个通道,发送操作在接收者准备好之前是阻塞的。如果通道中的数据无人接收,就无法再给通道传入其他数据。新的输入无法在通道非空的情况下传入,所以发送操作会等待channel再次变为可用状态,即通道值被接收后。对于同一个通道,接收操作是阻塞的,直到发送者可用。如果通道中没有数据,接收者就阻塞了。...原创 2018-12-05 20:09:18 · 10166 阅读 · 6 评论 -
Go Transport
在Go 对HTTP POST的支持中,简单介绍了客户端的定义。其中结构体Client有一个字段Transport,它用来定义单个HTTP请求的机制,如果为nil,则使用默认的DefaultTransport。下面是Transport的默认实现,由DefaultClient使用。它根据需要来建立网络连接,然后将其缓存,供后续调用重用。它使用HTTP代理,例如根据$HTTP_PROXY和$NO_PRO...原创 2018-12-07 19:30:28 · 5173 阅读 · 0 评论 -
Windows下Goland的CRLF问题
由于编辑器的不同或者在Windows平台上开发,容易出现文件行尾加入回车换行符,这会极大的扰乱跨平台协作。今天的编辑器已经确定为Goland,所以就只剩下Windows开发一种情况。出现上面的情况是由于Windows使用回车和换行两个字符来结束一行,而Mac和Linux只使用换行一个字符。假设你在Windows上使用Git上传代码,Git会在你提交时自动的把行结束符CRLF转化成LF,而在拉取...原创 2018-11-06 08:55:46 · 8332 阅读 · 0 评论 -
golang跨域访问
假设在站点 http://domain-a.com的某 HTML页面通过 <img>的src请求 http://domain-b.com/image.jpg。网络上的许多页面都会加载来自不同域的CSS样式表,图像和脚本等资源。出于安全原因,浏览器限制从脚本内发起的跨源HTTP请求。例如,XMLHttpRequest和Fetch API遵循同源策略。 这意味着使用这些API的Web应用...原创 2018-10-20 16:16:51 · 8636 阅读 · 1 评论 -
Go的自动化测试
自动化测试,是在预设条件下运行系统或应用程序,评估运行结果,预先条件包括正常条件和异常条件。Go本身提供了一套轻量级的测试框架,相对低级,但不过还是有效的。它依赖一个go test测试命令,和一组按照约定方式编写的测试函数,符合规则的测试代码会在运行测试时被自动识别并执行。但是这些文件是不会被普通的Go编译器编译,所以当将应用部署到生产环境时,它们不会被部署。测试规则文件命名与放置规则测试...原创 2018-09-22 14:28:54 · 7902 阅读 · 0 评论 -
Go数据类型转化
Go是一种强类型语言,同时也属静态类型语言。强类型语言强类型语言也称为强类型定义语言,是一种总是强制类型定义的语言。也就是说一旦一个变量被指定了某个数据类型,如果不经过强制转化,那么它就永远是这个数据类型了。例如下面的代码中,开始处变量str的类型是字符串,接着又赋给变量str一个int类型的值,这是不允许的。package mainimport &quot;fmt&quot;func main() {...原创 2018-09-25 17:21:41 · 3418 阅读 · 0 评论 -
/bin/sh: ./main: not found或者go run: no go files listed
出现问题的场景在本机(Windows系统)上生成一个可执行的二进制文件,然后上传到服务器上(Linux系统)上运行,就会出现ggo run: no go files listed的问题。另外一种问题也是相似的场景:在使用Compose构建镜像时,COPY的是在Linux(架构是amd64)上生成的可执行文件,所以在以alpine为基础镜像,不进行其他设置而运行二进制文件的时候,就会出现/bin...原创 2018-09-17 18:47:41 · 6897 阅读 · 0 评论 -
Go module的介绍及使用
Go1.1.1版本发布(2018-08-24发布)已经过去几天,从官方的博客中看到,有两个比较突出的特色,一个就是今天讲的module,模块概念。目前该功能还在试验阶段,有些地方还需要不断的进行完善。不过可以先尝尝鲜,感受下这个功能的魅力。主要概念介绍module是一个相关Go包的集合,它是源代码更替和版本控制的单元。模块由源文件形成的go.mod文件的根目录定义,包含go.mod文件的目...原创 2018-08-31 18:46:32 · 116674 阅读 · 6 评论 -
Go语言for range坑
关键字range可用于循环,类似迭代器操作,它可以遍历slice,array,string,map和channel,然后返回索引或值。可以使用”_”来忽略不想要的返回值。可以方便的读取上面类型中的内容,例如:package mainimport "fmt"func main() { str1 := []string{"1", "2", "3", "4"} for key...原创 2018-08-15 12:23:59 · 4206 阅读 · 1 评论 -
Golang请求数据处理
获取参数我们经常需要获取用户传递的数据,包括GET、POST等方式的请求。你可以通过如下方式获取数据: 通过r.Form.Get("参数名")、r.PostForm.Get("参数名")获取对应字段的值,r表示服务器接收或由客户端发送的HTTP请求。在Go标准包net/http中的request.go文件中可以看到该结构体的定义,其中与今天讨论有关的字段有type Request str...原创 2018-08-02 19:17:14 · 4268 阅读 · 0 评论 -
Golang DES加解密
通过网络传输的数据必须加密,并使用安全的数据传输体系,以防止被其他人读取或篡改。那么如何对数据进行加密,这是今天第一个探讨的问题。 现在假设有A、B两个用户,A需要将文件传输给B,同时又不想文件被其他人知道。这时候就需要对文件加密,那么B要读取文件,就需要解密。在密码学中,B打开文件的钥匙叫密钥。根据过程中使用密钥的个数,可以分为对称加密(使用一个)和非对称加密(使用两个,分别是私钥和公钥)。...原创 2018-07-31 16:22:15 · 7399 阅读 · 0 评论 -
解析json文件的Go依赖包
上一篇golang读取json配置文件介绍了使用encoding/json包来解析json文件,但是这种方法在面对结构复杂、字段较多的情况时,解析效率不是很高。上一篇中,我们在解析json文件时,需要提前在代码中定义好解析后对应的结构体,比较麻烦。而今天的主角jsonparser不需要你了解载入文件的结构,允许你通过提供它们的路径来访问。它可以快速的提取json内容,比encoding/json包...原创 2018-07-19 17:38:55 · 1499 阅读 · 0 评论 -
执行go run出现.\main.go:6:10: undefined: Test
复现问题首先来看问题是怎么出现的。在gotest目录下,有testundefined.go和main.go文件。其中main.go文件引用了testundefined.go中的结构体Test。编写没有语法错误,但是在运行go run命令时,却报错:# command-line-arguments.\main.go:6:10: undefined: Testtestundefined.go...原创 2019-04-23 19:31:04 · 11635 阅读 · 0 评论 -
Go静态代码检查工具GolangCI-Lint
GolangCI-Lint是一个lint聚合器,它的速度很快,平均速度是gometalinter的5倍。它易于集成和使用,具有良好的输出并且具有最小数量的误报。而且它还支持go modules。最重要的是免费开源。下面公司或者产品都使用了golangci-lint,例如:Google、Facebook、Red Hat OpenShift、Yahoo、IBM、Xiaomi、Samsung、Ard...原创 2019-04-28 18:00:50 · 51213 阅读 · 5 评论 -
Go Micro框架
Go Micro是一个微服务开发框架。Go Micro提供了分布式系统开发的核心要求,包括RPC和事件驱动的通信。特点自动服务注册与名称解析:服务发现是微服务开发中的核心,用于解析服务名与地址。consul是Go Micro默认的服务发现注册中心。发现系统可插拔,其他插件像etcd,kubernetes,zookeeper。负载均衡:在服务发现之上构建了负载均衡机制。使用随机处理过的哈希负...原创 2019-04-29 15:42:45 · 1935 阅读 · 0 评论 -
beego实现API自动化文档
beego的API自动化文档其实质就是使用swagger,但是功能还不是很完善。在使用时还有很多写法限制,否则自动化文档不会解析。例如:在配置接口路由必须按下面的写法。// @APIVersion 1.0.0// @Title beego Test API// @Description beego has a very cool tools to autogenerate documents...原创 2019-09-03 14:48:34 · 1391 阅读 · 1 评论 -
Go结构体标签用法
结构体标签根据传统,它是由空格分隔的键值对,每个key不能是空的字符串。由于包含的是键值对,所以一般字符串是以语义字符串的形式出现。例如:package mainimport ( "fmt" "reflect")func main() { type S struct { F string `species:"gopher" color:"bl...原创 2019-09-02 17:16:02 · 2616 阅读 · 0 评论 -
go实现文件的创建、编译及运行
之前在go实现文件的创建、删除和读取中介绍了Go包提供的操作文件的一些函数,现在用一个例子来完整介绍。下面会从文件夹的创建、文件的创建、文件内容的写入、编译以及删除等操作。package mainimport ( "fmt" "io/ioutil" "os" "os/exec")func main() { //createDir("","csdn") //createFi...原创 2019-08-28 18:11:18 · 2780 阅读 · 0 评论 -
Go分布式集群中生成全局唯一ID
使用UUIDUUID是通用唯一识别码(Universally Unique Identifier)的缩写,其目的是让分布式系统中的所有元素,都能有唯一的辨识信息。UUID是由一组32位数的16进制数字构成,所以UUID理论上总数为16^32=2^128。UUID有五个版本:版本1:基于时间戳和mac地址版本2:基于时间戳,mac地址和POSIX UID/GID版本3:基于MD5哈希算法...原创 2019-08-22 18:11:44 · 3754 阅读 · 0 评论 -
golang使用os\exec执行高级命令
下面的例子都是使用Go来执行ls -lah命令。首先来看最简单的func main() { cmd := exec.Command("ls", "-lah") if runtime.GOOS == "windows" { cmd = exec.Command("tasklist") } err := cmd.Run() if err != ...原创 2019-08-21 11:41:36 · 8615 阅读 · 0 评论 -
Go Modules详解
modules是Go 1.11版本提出的一个依赖包管理系统。自己如何创建module之前在Go1.1.1新功能module的介绍及使用文中中介绍了module功能,以及如何使用别人已经制作好的module。这一节我们来看看如何自己创建module来让别人使用。首先创建一个包,命名为testmod。但是需要注意:testmod目录必须在$GOPATH目录之外。默认情况下,$GOPATH目录...原创 2019-09-26 14:53:42 · 1536 阅读 · 0 评论 -
Missing type in composite literal
首先来看一个示例,它在idea中会直接提示错误。package mainimport ( "fmt")type Person struct { Name string Age int Favourite []string}func main() { person := Person{ "benben_2015", 18, {"huogu...原创 2019-07-09 09:39:01 · 9699 阅读 · 0 评论 -
micro入门指南——核心功能介绍
Micro是一套微服务构建工具库。对于微服务架构的应用,Micro提供平台层面、高度弹性的工具组件,让服务开发者们可以把复杂的分布式系统以简单的方式构建起来,并且尽可能让开发者使用最少的时间完成基础架构的构建。Go-micro是独立的RPC框架,它是micro工具集的核心。下面通过常用方法看下其核心功能是怎么工作的,来看一个micro服务端的代码片段// 服务端func main() { ...原创 2019-06-27 19:12:57 · 4029 阅读 · 0 评论 -
Micro API使用
微服务架构是把应用解耦成逻辑上的相对隔离的服务,API网关则是提供单一的入口把服务的API统一起来。通过服务发现,Micro API以http方式,将请求动态路由到具体的后台服务接口。Micro API是基于go-micro开发,所以它天然具备服务发现、负载均衡、编码及RPC通信的能力。因此,Micro API也是go-micro体系中的一个微服务,它自身也是可插拔的。安装通过命令go g...原创 2019-06-17 18:51:17 · 5479 阅读 · 2 评论 -
Go外部依赖包从vendor、$GOPATH和$GOPATH/pkg/mod下的查找顺序
vendorvendor概念最早是由Keith提出,用来存放依赖包。在版本1.5出现。例子gb项目提供了一个名为gsftp的示例项目,它有一个gsftp程序,在标准库之外有三个依赖项。golang.org/x/crypto/ssh, golang.org/x/crypto/ssh/agent和github.com/pkg/sftp。按vendor概念调整的目录结构如下:$GOPATH| ...原创 2019-06-11 18:50:10 · 12646 阅读 · 0 评论 -
go get命令
go get下载导入路径指定的包及其依赖项,然后安装命名包,即执行go install命令。用法:go get [-d] [-f] [-t] [-u] [-fix] [-insecure] [build flags] [packages]标记名称描述-d让命令程序只执行下载动作,而不执行安装动作。-f仅在使用-u标记时才有效。该标记会让命令程序忽略掉对已下载代码...原创 2019-06-14 11:07:03 · 24127 阅读 · 0 评论 -
Golang单元测试
Go的testing包为自动测试提供支持,它与go test命令一起使用。测试文件和测试函数需要满足下面的条件:测试代码必须保存在*_test.go文件测试函数命名符合TestName格式,Name以大写字母开头测试文件和被测试文件位于同一包中在feibo.go文件中定义了一个生成斐波拉契序列的方法,通过它来依次介绍Go中的测试。package mainimport ( "er...原创 2019-05-13 17:33:13 · 827 阅读 · 0 评论 -
Golang比较两个字符串切片是否相等
方法DeepEqual方法官方的reflect包中有个DeepEqual方法,可以用来判断任意x和y是否相等。相同类型的两个值可能相等,不同类型的值永远不会相等。func ReflectSlice(a, b []string) bool { return reflect.DeepEqual(a, b)}循环判断切片中的值func CompareSlice(a, b []string...原创 2019-05-16 14:40:38 · 13872 阅读 · 2 评论 -
golang获取命令行参数
os库package mainimport ( "fmt" "os")func main() { fmt.Println("os.Args")}os可以通过变量Args来获取命令参数,os.Args返回一个字符串数组。其中第一个参数就是执行文件的名字。flag包package mainimport ( "flag" "fmt")func main() {...原创 2019-05-10 10:39:18 · 5246 阅读 · 0 评论 -
go-micro中使用consul
上节我们在启动go-micro服务时,可以看到使用的服务注册是mdns。这节来了解下如何使用consul。默认的服务发现是在同一台机器上,在生产环境下,服务与服务发现部署到同一机器,这不是个很好的实践。所以把consul机器独立出来就很有必要。下面以Go Micro框架文章中的服务为例,编写一个go-micro服务。服务端microserver_consul.go文件package main...原创 2019-04-30 15:26:25 · 10520 阅读 · 4 评论 -
代码行数统计
使用gocloc工具进行统计先介绍一款工具,gocloc。它是用Go语言写的一个快速的代码行数统计工具。使用方式很简单,首先通过命令安装gocloc。$ go get -u github.com/hhatto/gocloc/cmd/gocloc,接着使用命令$ gocloc [目录路径或文件路径]即可完成统计。例如:D:\gotest>gocloc .-----------------...原创 2019-05-05 19:00:00 · 6083 阅读 · 0 评论 -
panic: runtime error: index out of range
首先先看一个示例,看看你能否发现代码中的问题。package mainimport "fmt"func main() { arr := []string{"hello", "world"} fmt.Println(test(arr))}func test(arr []string) string { return arr[0]}在实际工作中,可能不会..原创 2018-07-12 18:11:49 · 48637 阅读 · 3 评论 -
切片创建、重组、复制与追加
slice(切片)代表变长的序列,序列中每个元素都有相同的类型。slice的底层引用一个数组对象,它并会实际复制一份数据,只是创建一个新的数据结构。在内存中,它是由三个部分构成的结构体:指针、长度和容量。指针指向第一个slice元素对应的底层数组元素的地址,长度对应slice中元素的数目,长度不能超过容量。容量一般是从slice的开始位置到底层数据的结尾位置。 切片重组切片的长度可以用l...原创 2018-07-05 16:40:49 · 1619 阅读 · 0 评论 -
Golang数组去重&切片去重
方法一:定义一个新切片(数组),存放原数组的第一个元素,然后将新切片(数组)与原切片(数组)的元素一一对比,如果不同则存放在新切片(数组)中。package mainimport "fmt"func main() { var arr = []string{"hello", "hi", "world", "hi", "china", "hello"原创 2018-06-28 19:26:24 · 37813 阅读 · 1 评论