1-1 Go语言特点
特点:
1. 静态类型,编译开源语言
2. 脚本化的语法,支持多种编程范式(函数式,面向对象)
3. 原生,给力的并发支持并发编程
1-2 Go语言优势与劣势
Go语言的优势:
1.脚本化的语法;开发效率高,容易上手
2.静态类型+编译型,程序运行速度有保障;静态类型+编译型语言相对于动态类型+解释型语言的效率高
3.原生的支持并发编程;降低开发、维护成本/程序可以更好的执行
Go语言的劣势:
1.语法糖并没有Python和Ruby多;
2.目前的程序运行速度还不及C;比C++、java快
3.第三方函数库暂时不像绝对主流的编程语言那样多;
1-3 Linux下的安装
win & mac
下载安装包安装即可
Linux
1. wget https://go.dev/dl/go1.20.4.linux-arm64.tar.gz
2. tar -zxf go1.20.4.linux-arm64.tar.gz -C /usr/local
1-4 Linux下的环境变量
vim /etc/profile
#当前安装目录
export GOROOT=/usr/local/go
#工作区的集合
export GOPATH=~/golib:~/goproject
#可执行文件的目录
export GOBIN=~/gobin
export PATH=$PATH:$GOROOT/bin:$GOBIN
source /etc/profile
go version
2-1 Go语言-工作区和GOPATH
工作区是放置Go源码文件的目录;一般情况下,Go源码文件都需要存放到工作区中;但是对于命令源码文件来说,这不是必须的。
每一个工作区的结构都类似下图所示:/home/hypermind/golib: src/ pkg/ bin/
src目录用于存放源码文件;以代码包为组织形式
pkg目录用于存放归档文件(名称以.a为后缀的文件) 所有归档文件都会被存放到该目录下的平台相关目录中,用样以代码包为组织形式
平台相关目录:两个隐含的Go语言环境变量:GOOS(操作系统)和GOARCH(计算机架构)。以$GOOS_$GOPATH为命名方式,如:linux_amd64
<工作区目录>/pkg/<平台相关目录>/<一级代码包>/<二级代码包>/<末级代码包>.a
bin目录:用于存放当前工作区中的Go程序的可执行文件
1.当环境变量GOBIN已有效设置时,该目录会变的无意义;
2.当GOPATH的值中包含多个工作区的路径时,必须设置GOBIN,否则无法成功安装Go程序的可执行文件
2-2 Go语言-源码文件的分类和含义
Go源码文件:名称以.go为后缀,内容以Go语言代码组织的文件 多个Go源码文件是需要用代码包组织起来的
源码文件分为三类:命令源码文件、库源码文件(go语言程序) 测试源码文件(辅助源码文件)
命令源码文件:声明自己属于main代码包、包含无参数声明和结果声明的main函数;被安装后,相应的可执行文件会被存放到GOBIN指向的目录或<当前工作区目录>/bin下
命令源码文件是Go程序的入口,但不建议把程序都写在一个文件中;同一个代码包中强烈不建议直接包含多个命令源码文件。
库源码文件:不具备命令源码文件的那两个特征的源码文件, 被安装后,相应的归档文件会被存放到<当前工作区目录>/pkg/<平台相关目录>下
测试源码文件:不具备命令源码文件的那两个特征的源码文件。名称以_test.go为后缀。其中至少有一个函数的名称以Test或Benchmark为前缀。并且,该函数接受一个类型为
*testing.T或*testing.B的参数
func TestFind(t *testing.T){//省略若干条语句}
func BenchmarkFind(b *testing.B){//省略若干条语句}
2-3&4 Go语言-代码包的相关知识
代码包的作用:编译和归档Go程序的最基本单位。代码划分、集结和依赖的有效组织形式,也是权限控制的辅助手段
代码包的规则:一个代码包实际上就是一个由导入路径代表的目录;导入路径即<工作区目录>/src或<工作区目录>/pkg/<平台相关目录>之下的某段子路径
例如:代码包hypermind.cn可以对应于/home/hypermind/golib/src/hypermind.cn目录。(其中 /home/hypermind/golib是一个工作区目录)
代码包的声明:每个源码文件必须声明其所属的代码包;同一个代码包中的所有源码文件声明的代码包应该是相同的。
代码包声明与代码包导入路径的区别:
代码包声明:代码包声明语句中的包名称应该是该代码包的导入路径的最右子路径,例如:hypermind.cn/pkgtool package pkgtool
代码包导入语句中使用的包名称应该与其导入路径一致,例如: flag fmt strings import("flag" "fmt" "strings")
代码包的导入方法:带别名的导入:import str "strings" str.HasPrefix("abc","a")
本地化的导入:import ."strings" HasPrefix("abc","a")
仅仅初始化:import _"strings" 仅执行代码包中的初始化函数
代码包初始化函数:无参数声明和结果声明的init函数
init函数可以被声明在任何文件中,且可以有多个
init函数的执行时机——单一代码包内
1对所有全局变量进行求值 2执行所有init函数
如果在不同对代码包内
1执行被导入对代码包中对init函数 2执行导入它对那个代码包对init函数
导入顺序 A——B——C 执行顺序 C——B——A
init函数肯定在main函数之前先执行,每一个init函数都只会执行一次
3-1 go run 命令简介
go run命令:
用于运行命令源码文件
只能接受一个命令源码文件以及若干个库源码文件作为文件参数
goc2p项目地址:https://github.com/hyper-carrot/goc2p
用go编写了ds和pds,用以打印目录结构
3-4 go run 常用标记的使用
-v:列出被编译的代码包的名称
-work: 显示编译时创建的临时工作目录的路径,并且不删除它
-x: 打印编译过程中所需运行的命令
-n;打印编译过程中所需的命令,但并不执行
-x:打印编译过程中所需的命令,并执行他们。
3-6 go build 命令简介
go build 简介(1)
用于编译源码文件或代码包
编译非命令源码文件不会产生任何结果文件
编译命令源码文件会在该命令的执行目录中生成一个可执行文件
Go build 简介(2)
执行该命令且不追加任何参数时,它会试图把当前目录作为代码包并编译
执行该命令且以代码包的导入路径作为参数时,该代码包及其依赖会被编译
执行该命令且以若干源码文件作为参数时,只有这些文件会被编译
3-8 go install 命令简介
go Install 简介(1)
用于编译并安装代码包或源码文件
安装代码包会在当前工作区的 pkg/<平台相关目录> 下生成归档文件
安装命令源码文件会在当前工作区的 bin 目录或 $GOBIN 目录下生成可执行文件
go install 简介(2)
执行该命令且不追加任何参数时,它会试图把当前目录作为代码包并安装
执行该命令且以代码包的导入路径作为参数时,该代码包及其依赖会被安装
执行该命令且以命令源码文件及相关库源码文件作为参数时,只有这些文件会被编译并安装
3-10 go get 命令简介
go get
用于从远程代码仓库(如GitHub)上下载并安装代码包
受支持的代码版本控制系统有:Git Mercurial(hg) SVN Bazaar
指定的代码包会被下载到$GOPATH中包含的第一个工作区的src目录中
3-12 go get 常用标记的使用
go get:
-d : 只执行下载动作, 不执行安装动作
-fix :在下载代码包后先执行修正动作,而后再进行编译和安装
-u : 利用网络来更新已有的代码包及其依赖包
go命令教程:https://github.com/hyper-carrot/go_command_tutorial