内容简介:2007年,受够了C++煎熬的Google首席软件工程师Rob Pike纠集Robert Griesemer和Ken Thompson两位牛人,决定创造一种新语言来取代C++, 这就是Golang。出现在21世纪的GO语言,虽然不能如愿对C++取而代之,但是其近C的执行性能和近解析型语言的开发效率以及近乎于完美的编译速度,已经风靡全球。特别是在云项目中,大部分都使用了Golang来开发,不得不说,Golang早已深入人心。而对于一个没有历史负担的新项目,Golang或许就是个不二的选择。被称为GO语言之父的
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 目录下进行开发当使用,
GOPATH/src/github.com/golang/tools/…,然后再将go get github.com/golang/tools
相关命令来安装go的开发插件时,默认下载到
该目录下的go文件编译成可执行的二进制文件,放入 $GOPATH/bin 目录下,来使用go get <github等网址>....
,即在指定网址下载go文件,到 -
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
的错误的办法也管用
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Flask入门学习---初步了解模板
- javascript正则表达式入门先了解这些
- LevelDB 入门 —— 全面了解 LevelDB 的功能特性
- 还不了解 Etcd?一文带你快速入门
- Docker 入门概述(适合初学者了解相关概念)
- React Hooks了解一下?超简单入门Hooks(上)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
离散数学及其应用(英文版·第5版)
Kenneth H.Rosen / 机械工业出版社 / 2003 / 79.00元
本书第4版是全球500多所大学的指之一教材,获得了极大的成功。中文版也已被国内大学广泛有用为教材。第5版在前四版的基础上做了大量的改进,使其成为更有效的教学工具。 本书可作为1至2个学期的离散数学课入门教材,适用于数学、计算机科学、工程等专业的学生。一起来看看 《离散数学及其应用(英文版·第5版)》 这本书的介绍吧!