golang

golang基础之工程结构

孤街醉人 提交于 2019-12-21 00:51:10
Golang 工作空间 编译工具对源码目录有严格要求,每个工作空间 (workspace) 必须由 bin、pkg、src 三个目录组成。 workspace | +--- bin // go install 安装目录。 | | | +--- learn | +--- pkg。 // go build 生成静态库 (.a) 存放目录。 | | | +--- darwin_amd64 | | | +--- mylib.a | | | +--- mylib | | | +--- sublib.a | +--- src // 项目源码目录。 | +--- learn | | | +--- main.go | +--- mylib | +--- mylib.go | +--- sublib | +--- sublib.go 可在 GOPATH 环境变量列表中添加多个工作空间,但不能和 GOROOT 相同。 export GOPATH=$HOME/projects/golib:$HOME/projects/go 通常 go get 使用第一个工作空间保存下载的第三方库。 Golang目前有很多很多个标准的包,覆盖了几乎所有的基础库。 golang.org有所有包的文档。 Golang 源文件 编码:源码文件必须是 UTF-8 格式,否则会导致编译器出错。 结束:语句以 ";" 结束

关注你所关注的 - Golang社区调研报告

 ̄綄美尐妖づ 提交于 2019-12-20 22:37:04
Golang语言可以说现在炙手可热,大家熟悉的Kubernates 就是使用Golang开发的。 我们在最近于伦敦和圣地亚哥举行的GopherCon大会上调查了1000多名开发者,以更好地了解Go 开发社区和对Go Module的总体看法。随着最近发布的Go 1.13版本,现在是向社区分享一些有趣数据的好时机。 BTW, 在JFrog,我们也是Go开发者(JFrog CLI和Xray都是用Go编写的)。 同时也是GoLang社区的贡献者, 并为社区维护贡献了公共注册中心 Gocenter(goproxy) https://gocenter.io/ . 加速Golang语言开发人员构建速度。 以下是我们学到的一些关键的东西: Go开发人员是高度投入的 绝大多数的Go开发者都在使用最新版本的GoLang。超过70%的受访者表示使用的是最新版本的Go 1.12。 同样值得注意的是,超过82%的Golang开发者使用的是1.11或更新的版本,因此能够使用Go Module。只有一小部分报告使用了Go的早期版本。 几乎同样多的使用最新版本的Go开发人员也报告在他们的组织中采用了Go Module。也有相当多的人希望尽快使用Go Module,这样到2020年中期,其使用率将上升到至少80%,并可能接近100%。 GoLang被广泛应用于各个行业 虽然Go开发应用于广泛的计算领域

linux下golang gRPC配置详解

こ雲淡風輕ζ 提交于 2019-12-20 21:52:09
1.安装gRPC运行环境 go get google.golang.org/grpc 这里的grpc通俗来说就说用在代码里的一个类库,后面的例子可以看到。比较坑的是这里可能需要翻墙..... 2.安装protoc 这里需要安装 proto buffer 的编译器。首先在 官网 下载,如c++版本的 protobuf-cpp-3.4.1.tar.gz ,解压后进行编译: ./configure make && make install 3.安装protoc-gen-go go get -a github.com/golang/protobuf/protoc-gen-go 4.编写proto文件 基于protobuf的跨语言的特性,不难想到它自己实现了一套数据类型。这里有一个简单的例子 //testHello.proto syntax = "proto3"; package protos; // The service definition. service Devops { // 定义服务 rpc SayHello (HelloRequest) returns (Response) {} } // The request message containing the user's name. message HelloRequest { string name = 1; } //

Golang报错:Cannot convert expression of type interface{} to type []byte

ぃ、小莉子 提交于 2019-12-20 01:55:52
在使用golang实现后端登录逻辑的时候,碰到下面的问题:Cannot convert expression of type interface{} to type []byte 首先介绍下问题出现的场景:使用Redis存储用户登录信息,第三方包使用的是redigo 问题原因:由于从Redis里 取出的数据为interface{}类型,需要先进行类型转换后,才能做后续处理 代码如下: res, err := redis.String(coon.Do("HGet", "users", id)) //这里如果不进行redis.String()操作,并且这里只能使用redis的函数 user = &User{} err = json.Unmarshal([]byte(res), user) //则这里就会报错 来源: https://www.cnblogs.com/lty-fly/p/11970201.html

Golang之文件数据库--Bolt库的使用

╄→尐↘猪︶ㄣ 提交于 2019-12-20 00:15:34
做后端开发的数据库那是见得多了,像什么Mysql、SQL Server、Oracle、SQLite、MongoDB、Redis等都是一些比较主流的数据库(这里边有关系型和非关系型的数据库,这里不讨论这个),具体使用哪种根据需要来定。不过这些数据库都是比较大型的数据库了(这里指像Mysql、SQL Server、Oracle这些),需要专门的工具来识别db文件,而且携带一大堆组件等等(因为这些数据库本身就是一个软件了),实在是小不到哪里去。而这里要介绍的Bolt库它不是一个数据库,而是一个用来操作文件数据库的依赖库,通过它我们可以实现创阿金一个文件数据库的功能。不过实质上在创建的时候你会发现其实他存数据就只有一个db文件,别的没有,一切的数据存取操作都通过这个db文件来完成。 由bolt构建的db文件是具有一定结构的,它会将一个db文件划分为若干个bucket(桶),这些bucket需要我们主动创建,就相当于磁盘分区(我们这里将db文件比作磁盘,db文件内创建的每个桶,我们比作分区),每个桶都有其自己的名字,方便我们找到桶。桶内以键值对的方式存储数据,当我们想要在某个桶内存取数据的时候,首先打开db文件,然后通过桶名找到指定桶,最后对桶进行存取操作。 db文件和bucket(桶)和kv(键值)对的关系如下图: bolt操作文件数据库除了打开db文件之外,剩下的无非就是读、写db文件了

Go 开发关键技术指南 | 为什么你要选择 GO?(内含超全知识大图)

折月煮酒 提交于 2019-12-19 21:51:06
作者 | 杨成立(忘篱) 阿里巴巴高级技术专家 关注“阿里巴巴云原生”公众号,回复 Go 即可查看清晰知识大图! 导读 :从问题本身出发,不局限于 Go 语言,探讨服务器中常常遇到的问题,最后回到 Go 如何解决这些问题,为大家提供 Go 开发的关键技术指南。我们将以系列文章的形式推出《Go 开发的关键技术指南》,共有 4 篇文章,本文为第 1 篇。 Go 开发指南大图 Overview 该指南主要讨论了服务器领域常见的并发问题,也涉及到了工程化相关的问题,还整理了 C 背景程序员对于 Go 的 GC 以及性能的疑问,探讨了 Go 的错误处理和类型系统最佳实践,以及依赖管理的难处、接口设计的正交性,当然也包含我们在服务器开发中对于 Go 实践的总结,有时候也会对一些有趣的问题做深度的挖掘,列出了 Go 重要的事件和资料集合,以及 Go2 的进展和思考。 以下是各个章节以及简介: About the Name :为何 Go 有时候也叫 Golang? Why Go :为何要选择 Go 作为服务器开发的语言?是冲动?还是骚动? Milestones :Go 的重要里程碑和事件,当年吹的那些牛逼,都实现了哪些? GC :Go 的 GC 靠谱吗?Twitter 说相当的靠谱,有图有真相。 Could Not Recover :君可知,有什么 panic 是无法 recover 的

Go 开发关键技术指南 | 为什么你要选择 GO?(内含超全知识大图)

青春壹個敷衍的年華 提交于 2019-12-19 21:50:53
作者 | 杨成立(忘篱) 阿里巴巴高级技术专家 关注“阿里巴巴云原生”公众号,回复 Go 即可查看清晰知识大图! 导读 :从问题本身出发,不局限于 Go 语言,探讨服务器中常常遇到的问题,最后回到 Go 如何解决这些问题,为大家提供 Go 开发的关键技术指南。我们将以系列文章的形式推出《Go 开发的关键技术指南》,共有 4 篇文章,本文为第 1 篇。 Go 开发指南大图 Overview 该指南主要讨论了服务器领域常见的并发问题,也涉及到了工程化相关的问题,还整理了 C 背景程序员对于 Go 的 GC 以及性能的疑问,探讨了 Go 的错误处理和类型系统最佳实践,以及依赖管理的难处、接口设计的正交性,当然也包含我们在服务器开发中对于 Go 实践的总结,有时候也会对一些有趣的问题做深度的挖掘,列出了 Go 重要的事件和资料集合,以及 Go2 的进展和思考。 以下是各个章节以及简介: About the Name :为何 Go 有时候也叫 Golang? Why Go :为何要选择 Go 作为服务器开发的语言?是冲动?还是骚动? Milestones :Go 的重要里程碑和事件,当年吹的那些牛逼,都实现了哪些? GC :Go 的 GC 靠谱吗?Twitter 说相当的靠谱,有图有真相。 Could Not Recover :君可知,有什么 panic 是无法 recover 的

Go语言特性介绍

谁说胖子不能爱 提交于 2019-12-19 15:18:02
采用goroutine的方式使多线程编写更加容易、代码可读性更好,可以简单理解为订阅者发布者模式,设计类似于unix管道通信模式, 对于消息队列编程有了解的话很容易理解goroutine的处理模式。 能直接编译成二进制文件没有第三方依赖,因为go是静态编译,包含自己runtime,相对于c会大一些, 但相对java 这种依赖虚拟器的语言编译后的文件小的多。对于docker环境更小的镜像意味着更快的启动速度。 语言简洁高效,相对于python ruby编码负担没有增加多少,运行效率却有大幅度的提升。 golang对新人友好,学习负担小,语法简单,没有多余的语法糖,学习速度快。 c语言易学难用,go易学相对好用,学习和使用达到一个不错的价值平衡。学习和收益比很高,是一个性价比很好的语言。 go难做坏事,即使新手的代码也不至于对代码体系结构造成大的危害,相对对于java这类依赖于框架的语言,如果对框架和复杂语言特性没有深入理解,很容易写出破坏性代码。 golang内置gc,gc也是为了对程序员友好,减少考虑销毁对象的编码负担,保证内存安全。 golang支持跨平台,可以跨平台编译,跨平台运行,支持各种主流软硬件环境。 golang的编译速度飞快,编译不等待,甚至可以替代python等脚本语言,做运维脚本使用。 对系统资源要求非常低,节省服务器,用户可以使用廉价的树莓派作为服务器。

Golang使用pprof进行性能优化

人盡茶涼 提交于 2019-12-18 21:44:40
文章目录 pprof模块 准备工具 图形化工具 压测工具 go-torch 工具型应用 服务型应用 Gin框架使用pprof pprof与性能测试结合 go tool pprof命令 介绍 图形化展示 命令行交互界面 top list pdf help 参考 pprof模块 Go语言项目中的性能优化主要有以下几个方面: CPU profile:报告程序的 CPU 使用情况,按照一定频率去采集应用程序在 CPU 和寄存器上面的数据 Memory Profile(Heap Profile):报告程序的内存使用情况 Block Profiling:报告 goroutines 不在运行状态的情况,可以用来分析和查找死锁等性能瓶颈 Goroutine Profiling:报告 goroutines 的使用情况,有哪些 goroutine,它们的调用关系是怎样的 Go语言内置了获取程序的运行数据的工具,包括以下两个标准库: runtime/pprof :采集工具型应用运行数据进行分析 net/http/pprof :采集服务型应用运行时数据进行分析 pprof开启后,每隔一段时间(10ms)就会收集下当前的堆栈信息,获取格格函数占用的CPU以及内存资源;最后通过对这些采样数据进行分析,形成一个性能分析报告。 注意,我们只应该在性能测试的时候才在代码中引入pprof。 准备工具 图形化工具

golang 的 sync.WaitGroup

喜夏-厌秋 提交于 2019-12-18 17:43:03
WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。 官方对它的说明如下: A WaitGroup waits for a collection of goroutines to finish. The main goroutine calls Add to set the number of goroutines to wait for. Then each of the goroutines runs and calls Done when finished. At the same time, Wait can be used to block until all goroutines have finished. sync.WaitGroup只有3个方法,Add(),Done(),Wait()。 其中Done()是Add(-1)的别名。简单的来说,使用Add()添加计数,Done()减掉一个计数,计数不为0, 阻塞Wait()的运行。 例子代码如下: 同时开三个协程去请求网页, 等三个请求都完成后才继续 Wait 之后的工作。 var wg sync.WaitGroup var urls = []string{ " http://www.golang.org/" , " http://www