学习参考
- https://books.studygolang.com/The-Golang-Standard-Library-by-Example/
- https://studygolang.com/,中文https://studygolang.com/pkgdoc
学习方向
区块链(BT,分布式账本技术)研发工程师
Go服务器端\游戏软件工程师:例如处理日志、数据打包、虚拟机处理、文件系统等,适合数据处理,处理大并发
Golang分布式\云计算软件工程师
golang简介
2007年诞生Go语言,2009年向全球开放源代码,2015年在1.5版本中移除了最后残余的C代码
- 发明者:
- Ken Thompon(肯·汤普森):Unix的原创者、C语言、图灵奖、美国国家技术奖等
- Rob Pike(罗布·派克):Unix团队成员、Plan9操作系统计划成员、UTF-8、奥运会射箭银牌、天文学家
- Robert Griesemer(罗伯特·格瑞史莫):Java的HotSpot编译器、Chrome浏览器的JavaScript引擎V8
- 发明该语言的初衷:
- 计算机硬件更新频繁,性能提高很快,目前主流的编程语言发展明显落后于硬件,不能合理利用多核CPU的优势提高软件系统性能
- 软件系统复杂度越来越高,维护成本越来越高,目前缺乏一个足够简洁高效的编程语言。目前语言存在3个通病,一是风格不统一,二是计算能力不够,三是处理大并发不够好
- 企业运行维护很多C/C++项目,C/C++程序运行速度虽然很快,但是编译速度很慢,同时还存在内存泄漏的一系列的问题
- golang特点
Go语言保证了既能达到静态编译语言的安全和性能,又达到动态语言开发维护的高效率,使用一个表达式来形容Go语言:GO=C+Python,既有C静态语言程序运行速度,又有Python动态语言的快速开发- 从C语言中继承很多理念,包括表达式语法、控制结构、基础数据类型、调用参数传值、指针等,也保留了和C一样的编译执行方式以及弱化的指针
// go语言的指针 func testZZ(num *int){ *num = 20 }
- 引入包的概念,用于组织程序结构,golang的一个文件都要归属于一个包,而不能单独存在
- 垃圾回收机制,自动内存回收,不需要开发人员管理
- 天然并发
- 从语言层面支持并发,实现简单
- goroutine,轻量级线程,可实现大并发处理,搞笑利用多核
- 基于CPS(communicating sequential processes)并发模型实现
- 吸收管道通信机制,形成Go语言特有的管道channel,通过channel可以实现不同的goroute之间的相互通信
- 函数可以返回多个值
// go函数支持返回多个值(写一个函数,实现同时返回和与差) func GetSumAndSub(n1 int,n2 int)(int,int){ sum := n1+n2 //go语句后面不需要带分号 sub := n1-n2 return sum,sub }
- 新的创新,例如切片slice、延时执行defer等
- 从C语言中继承很多理念,包括表达式语法、控制结构、基础数据类型、调用参数传值、指针等,也保留了和C一样的编译执行方式以及弱化的指针
开发工具
环境
语言环境https://golang.google.cn/dl/,采用默认安装方式,全部点击“下一步”即可,查看安装的golang的版本:
C:\Users\Administrator\Desktop>go version
go version go1.16.6 windows/amd64
环境变量:
GOROOT:指定SDK的安装路径,默认是C:\Program Files\Go
Path:添加SDK的bin目录,默认是C:\Program Files\Go\bin
GOPATH:工作目录,go项目的工作路径
Linux配置go的环境变量:
vim /etc/profile
export GOROOT=/opt/go
export PATH=$PATH:$GOROOT/bin
export GOPATH=$HOME/goproject
source /etc/profile
IDE
开发IDE推荐VScode或者GoLand(收费),本人使用的是GoLand,因为已经购买过JetBrains全家桶,并且这个工具在自动完成和提示方面做的比其他软件更好。
开发入门
hello world
// hello.go
// 学习打印hello world
package main
import "fmt"
func main() {
fmt.Println("hello,world!")
}
说明:
- go文件的后缀
.go
package main
表示该hello.go文件所在的包是main,在go中,每个文件必须归属于一个包import "fmt"
表示引入一个包,包名fmt,引入该包后,就可以使用fmt的包函数,例如fmt.Println
func main() {}
,func是一个关键字,表示一个函数;main是函数名,是一个主函数,即程序的入口fmt.Println("hello,world!")
表示调用fmt包函数Println输出"hello,world!"
运行:
通过go run go程序文件
运行go程序,例如go run hello.go
D:\goproject\src\go_code>go run hello.go
hello,world!
编译:
通过go build go程序文件
对go程序文件进行编译,例如go build hello.go
,生成hello.exe
D:\goproject\src\go_code 的目录
2021/07/22 21:08 <DIR> .
2021/07/22 21:08 <DIR> ..
2021/07/22 21:08 103 hello.go
1 个文件 103 字节
2 个目录 175,634,698,240 可用字节
D:\goproject\src\go_code>go build hello.go
D:\goproject\src\go_code>hello.exe
hello,world!
D:\goproject\src\go_code>
执行流程分析
执行方式有以下两种:
- 对源码编译后再执行
- 直接使用go run执行源代码
这两种执行流程的方式区别:
- 如果先编译生成了可执行文件,则可以将该执行文件拷贝到没有go开发环境的机器上,仍然可以运行
- 如果使用go run执行go代码,则移植到其他的系统上时需要go开发环境
- 在编译时,编译器会将程序的依赖库文件一起编译到可执行文件中,因此可执行文件要比源代码大很多
开发注意事项
- go源文件以.go为扩展名
- go应用程序的执行入口是main()函数
- go语言严格区分大小写
- go方法由一条条语句构成,每个语句后不需要分号(go语言会在每行语句后自动加分号)
- go编译器是一行一行进行编译的,因此一行只能写一条语句,不能把多条语句写在同一行
- go语言定义的变量或者import的包如果没有用到,则代码编译不通过
- 大括号都是成对出现的
go语言的转义字符
常用转义字符如下:
\t:表示一个制表符,通常使用它进行排版
\n:换行符
\\:一个\
\":一个"
\r:一个回车
注释
1. 行注释
// 注释内容
2. 块注释(多行注释):块注释不允许嵌套
/*
注释内容
*/