Go语言基础
一、简介
(1)什么是go语言?
2007年,受够了C++煎熬的Google首席软件工程师Rob Pike纠集Robert Griesemer和Ken Thompson两位牛人,决定创造一种新语言来取代C++, 这就是Golang。出现在21世纪的GO语言,虽然不能如愿对C++取而代之,但是其近C的执行性能和近解析型语言的开发效率以及近乎于完美的编译速度,已经风靡全球。特别是在云项目中,大部分都使用了Golang来开发,不得不说,Golang早已深入人心。而对于一个没有历史负担的新项目,Golang或许就是个不二的选择。
被称为GO语言之父的Rob Pike说,你是否同意GO语言,取决于你是认可少就是多,还是少就是少(Less is more or less is less)。Rob Pike以一种非常朴素的方式,概括了GO语言的整个设计哲学–将简单、实用体现得淋漓尽致。
很多人将GO语言称为21世纪的C语言,因为GO不仅拥有C的简洁和性能,而且还很好的提供了21世纪互联网环境下服务端开发的各种实用特性,让开发者在语言级别就可以方便的得到自己想要的东西。
1.1、发展历史
2007年9月,Rob Pike在Google分布式编译平台上进行C++编译,在漫长的等待过程中,他和Robert Griesemer探讨了程序设计语言的一些关键性问题,他们认为,简化编程语言相比于在臃肿的语言上不断增加新特性,会是更大的进步。随后他们在编译结束之前说服了身边的Ken Thompson,觉得有必要为此做一些事情。几天后,他们发起了一个叫Golang的项目,将它作为自由时间的实验项目。
2008年5月 Google发现了GO语言的巨大潜力,得到了Google的全力支持,这些人开始全职投入GO语言的设计和开发。
2009年11月 GO语言第一个版本发布。2012年3月 第一个正式版本Go1.0发布。
2015年8月 go1.5发布,这个版本被认为是历史性的。完全移除C语言部分,使用GO编译GO,少量代码使用汇编实现。另外,他们请来了内存管理方面的权威专家Rick Hudson,对GC进行了重新设计,支持并发GC,解决了一直以来广为诟病的GC时延(STW)问题。并且在此后的版本中,又对GC做了更进一步的优化。到go1.8时,相同业务场景下的GC时延已经可以从go1.1的数秒,控制在1ms以内。GC问题的解决,可以说GO语言在服务端开发方面,几乎抹平了所有的弱点。
在GO语言的版本迭代过程中,语言特性基本上没有太大的变化,基本上维持在GO1.1的基准上,并且官方承诺,新版本对老版本下开发的代码完全兼容。事实上,GO开发团队在新增语言特性上显得非常谨慎,而在稳定性、编译速度、执行效率以及GC性能等方面进行了持续不断的优化。
1.2、go语言的优缺点
参考博客:https://blog.csdn.net/QcloudCommunity/article/details/80735770
(2)golang语言特性
2.1. 垃圾回收
- 内存自动回收,再也不需要开发人员管理内存
- 开发人员专注业务实现,降低了心智负担
- 只需要new分配内存,不需要释放
2.2. goroute天然并发
- 从语言层面支持并发,非常简单
使用一个
go
则在编译时会自动开启一个线程来执行后面的命令/函数/方法,不用像python需要先调用thread模块来开启线程- goroute,轻量级线程,创建成千上万个goroute成为可能
- 基于CSP(Communicating Sequential Process)模型实现
2.3. goroute线程之间的数据通信——管道
使用go可以创建一个轻量级的goroute线程,线程之间如何通信,共享数据呢?答案是:使用管道来进行通信。管道需要定义并创建后,才能使用
定义一个管道:
var my_pipe chan int //my_pipe为管道名,chan为管道关键字表示定义的是一个管道,int表示管道内存储的数据类型
创建一个管道:
my_pipe = make(chan int,10) //make关键字表示开辟一个内存空间,第一个参数表示创建一个管道,10表示管道能存储的数据类型个数,如果超出则阻塞
定义和创建可以合并写
my_pipe := make(chan int,10)
管道的定义和使用范例:
//goroute线程之间使用管道进行数据通信 func main() { go pi_pie() } func pi_pie() { pipe := make(chan int, 10) //make关键字创建一个管道(关键字chan),管道内装int类型的数据,并且管道大小能装10个数字,超过则阻塞 pipe <- 10 //向管道内放入数据 pipe <- 9 pipe <- 9 pipe <- 7 pipe <- 6 var p1 int p1 = <-pipe //从管道取出数据 fmt.Println(p1) fmt.Println(len(pipe)) }
2.4. 多返回值
go的函数可以有多个返回值
“`
func main() {
x,y:=p_fun(10,80)
// x,_ := p_fun(10,80) 多返回值函数时,只要一个返回值
fmt.Println(x,y)
}//多返回值函数
func p_fun(a int,b int) (int,int) { //函数传入2个整型参数,返回2个值,都为int类型
sum := a+b
avg := (a+b)/2
return sum,avg
}2.5. go的“包”的概念
- 1.和python一样,把相同功能的代码放到一个目录,称之为包
- 2.包可以被其他包引用
- 3.main包是用来生成可执行文件,每个程序只有一个main包
- 4.包的主要用途是提高代码的可复用性
- 5.包的引用
go在首行使用“
package <包名>
”来声明自己所在的包(主程序包为main包,也可以自定义包名),“import”引入其他的包,go自带的系统包所在的路径已经在“GOROOT”环境变量中设置好了
可以使用“import”直接引入,而自己定义的包:package <包名>
在import导入时则需要相对路径:第三方包默认在“GOROOT”和“GOPATH”环境变量所在的路径下的src目录下寻找
Go的package不支持使用“../”方式的相对路径,都是从$GOPATH/src下一层一层找的
2.6. go文件编码规范
使用
gofmt <go文件>
使go文件内的代码更规范(缩进等格式更规范),使用gofmt -w <go文件>
将原来的go文件修改的更规范
二、环境搭建
环境搭建参考网址:https://blog.csdn.net/fearless11/article/details/70543932
(1)开发环境搭建
1.1 安装Go环境
- 打开网址https://golang.org/dl/
- 根据操作系统选择对应的安装包
- 点击安装包进行安装(linux直接解压)
设置环境变量(linux)
export GOROOT=$PATH:/path/to/go/ #go的家目录
export PATH=GOROOT/bin/ #go执行命令路径
export GOPATH=/home/user/project/go #项目路径
- 设置环境变量(window)
参考:https://blog.csdn.net/fearless11/article/details/70543932
1.2 开发环境搭建(IDE为VScode)
- 打开网址:https://code.visualstudio.com/
- 根据操作系统选择对应的安装包
- 根据操作系统选择对应的安装包
- 根据操作系统选择对应的安装包
调试工具delve安装
mac: brew install go-delve/delve/delve
linux&windows: go get -u github.com/derekparker/delve/cmd/dlv #请确保已经安装了git
- 注意事项: VScode开发的项目路径与环境变量 ==“GOPATH”== 的路径要一致,如 $GOPATH = d:\go_build 那么VScode开发的项目也要在d:\go_build目录下
1.3 开发环境搭建(IDE为pycharm)
'''新版本的pycharm可能已经无法使用''' pycharm的go语言开发支持插件下载: 1.在pycharm中通过在线搜索go插件来安装 2.可能因为版本原因,pycharm的在线插件安装可能搜索不到,可以采用本地安装的方法: 插件本地安装包下载页面: https://plugins.jetbrains.com/plugin/5047-go-language-golang-org-support-plugin (pycharm社区版) https://plugins.jetbrains.com/plugin/9568-go (pycharm专业版) 根据pycharm的idea版本号(idea版本号在安装目录下的“build.txt/readme.txt”文件中,通常是AA.BBBB.CC的形式)来选择下载插件的版本 > 需要注意的是,pycharm的idea号AA.BBBB.CC 只要 AA与网站上的idea号对应上即可,它是一个范围,如idea号172.4343.24就可以下载范围“172.3968-172.*”对应的插件版本
(2)编译环境和编译流程
2.1 编译需要的目录环境
我们的go项目的开发根目录由 GOPATH 环境变量决定了(范例为:d:/go_build),当我们需要开发项目工程时,需要在根目录下先创建src目录(规定死了),
然后在 src 目录下创建开发的项目名称,如项目名称为app_store, 那么你的go文件应该在 d:/go_build/src/app_store目录下进行开发当使用,
go get github.com/golang/tools
相关命令来安装go的开发插件时,默认下载到 GOPATH/src/github.com/golang/tools/…,然后再将
该目录下的go文件编译成可执行的二进制文件,放入 $GOPATH/bin 目录下,来使用go get <github等网址>....
,即在指定网址下载go文件,到GOPATH/bin 目录下,之后可以在IDE开发中直接使用(如调试台)2.2 编译go文件为二进制可执行代码
使用
go build <go文件所在目录>
命令,来进行go文件编译例如: ==GOPATH==为 d:/go_build时,编译d:/go_build/src/app_store/app.go文件时,编译的命令为 :
`go build app_store/app.go
则会在当前目录生成app.exe执行文件(Windows)go build时,默认会从$GOPATH/src/ 目录下开始寻找目录,因此只需要相对地址即可
编译go文件为可执行文件并将文件放到指定位置下
go build -o %GOPATH%/bin/calcs.exe app_store/app.go //将go文件编译到GOPATH变量所在目录下的bin目录里面,名称为calcs,后缀为.exe
添加参数 “- o <执行文件路径(含文件名)>” 即可指定编译的文件位置,需要加上文件名和后缀(Windows为.exe;linux可不要)
go基础介绍相关代码:
package main
import (
"fmt"
"time"
)
func main() {
// bingfa()
// go pi_pie()
//a := my_sum(10,20)
//fmt.Println(a)
x,y:=p_fun(10,80)
// x,_ := p_fun(10,80) 多返回值函数时,只要一个返回值
fmt.Println(x,y)
time.Sleep(2 * time.Second) //主进程停留2秒,否则并发线程还没有开启并执行完就结束了
}
//go的高并发
func bingfa() {
for i := 0; i <= 100; i++ {
go fmt.Println(i) //go关键字即表示开启一个线程(轻量级的线程goroute)
}
}
//goroute线程之间使用管道进行数据通信
func pi_pie() {
pipe := make(chan int, 10) //make关键字创建一个管道(关键字chan),管道内装int类型的数据,并且管道大小能装10个数字,超过则阻塞
pipe <- 10 //向管道内放入数据
pipe <- 9
pipe <- 9
pipe <- 7
pipe <- 6
var p1 int
p1 = <-pipe //从管道取出数据
fmt.Println(p1)
fmt.Println(len(pipe))
}
//带返回值的函数
func my_sum(a int,b int) int { //函数传入2个参数,类型为整型,返回值也为整型
sum := a+b
return sum
}
//多返回值函数
func p_fun(a int,b int) (int,int) { //函数传入2个整型参数,返回2个值,都为int类型
sum := a+b
avg := (a+b)/2
return sum,avg
}
go开发部分插件无法安装解决方案:
官方的安装文档是使用go get github.com/tools/godep
,很可惜,因为“网络”问题会报一个找不到golang.org/x/tools/go/vcs
的错误。
然而https://github.com/golang/tools 是 golang.org/x/tools 的一个镜像,代码是一样的,所以我是如下安装的:
1.执行命令
go get github.com/golang/tools
2.在GOPATH\src\github.com\golang目录下就有tools文件夹。
3.在src下和github.com平级新建golang.org文件下,在此文件夹下建x文件夹,然后将tools文件夹都复制进去。
4.然后再执行
go get github.com/tools/godep
此时godep安装在你的GOPATH\bin目录下。
对其他类似 golang.org/x/tools/go/vcs
的错误的办法也管用
有疑问加站长微信联系(非本文作者)