go语言工作区
- 工作区是Go中的一个对应于特定工成的目录,其包括src、pkg、bin三个目录
- src:用于以代码包的形式组织并保存Go源码文件
- pkg:用于存放经由go install命令构建安装后的代码包(包括Go库源码文件)的".a"的归档文件
- bin:与pkg目录类似,在通过go install命令完成安装后,保存有Go命令源码文件生成的可执行文件
- 目录src用于包含所有的源代码,是Go命令工具的一个强制的规则,而pkg和bin则无需手动创建,如果必要Go命令行工具在构建过程中会自动创建这些目录
- 只要当环境变量GOPATH中只包含一个工作区的目录路径时,go install命令才会把命令源码安装到当前工作区的bin目录下。若环境变量GOPATH中包含多个工作区的目录路径,像这样执行go install命令就会失效,此时必须设置环境变量GOBIN
go install: no install location for .go files listed on command line (GOBINnot set
工作区如何设置(linux mac版)
工作区设置路径为环境变量中的GOPATH
#mac设置GOPAT
vim .bash_profile
export GOPATH=/Users/conyong/GoWork/Public:/Users/conyong/GoWork/Company
#Linux设置GOPATH
vim .bashrc
exportGOROOT=$HOME/go
exportPATH=$PATH:$GOROOT/bin
exportGOPATH=$HOME/workspace/go
exportPATH=$PATH:$GOPATH/bin
#Windows设置GOPATH
我的电脑-> 右击属性 -> 高级系统设置 -> 环境变量 -> 系统环境变量 -> 添加GOPATH
第一个Go程序
- Go语言源文件的扩展是.go
package main
import "fmt"
func main(){
fmt.Println("hello world!")
fmt.Println("golang")
}
编译过程
要执行Go语言代码可以使用命令或IDE来完成编译
- 编译命令:
go build hello.go
- 编译并运行命令:
go run hello.go
常用命令行
go help
- 获取对应命令的帮助文档,可以获取到对应命令的作用以及对应参数
go help build
go version
- 获取系统安装go语言版本号
go build
- 编译项目,使其打包成可运行程序,配合参数可以进行交叉编译
- 标准格式
- go build [-o output] [-i] [build flags] [packages]
- -o 参数决定了编译后文件名称,例如我们要程序main.go编译后程序名为hello,我们可以执行以下命令
go build -o hello main.go
- -i install 安装作为目标的依赖关系的包(用于增量编译提速),一般很少使用
- 编译参数一般并不会添加,以下举例几个,详细信息可以使用go help build获取
- packages
- 所编译的包名,如果不填写默认为编译当前路径下的入口文件,文件名称默认为当前文件夹命令
- 交叉编译
- go语言向下支持C语言,可以在go语言中直接编写C语言代码
- 但是在编译时,必须支持C语言
- Mac上编译Linux可执行二进制文件
CGO_ENABLED=0GOOS=linux GOARCH=amd64 go build main.go
- Mac上编译Windows可执行二进制文件
CGO_ENABLED=0GOOS=windows GOARCH=amd64 go build main.go
- Linux上编译Mac可执行二进制文件
CGO_ENABLED=0GOOS=darwin GOARCH=amd64 go build main.go
- Linux上编译Windows可执行二进制文件
CGO_ENABLED=0GOOS=windows GOARCH=amd64 go build main.go
- Windows上编译Mac可执行二进制文件
SET CGO_ENABLED=0 SET GOOS=darwin SET GOARCH=amd64 go build main.go
- Windows上编译Linux可执行二进制文件
SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go build main.go
- 交叉编译参数含义
- CGO_ENABLED 是否使用cgo编译,0为不使用,1为使用,使用cgo进行交叉编译时需要编译机器安装对应的cgo程序
- GOOS 目标操作系统标识,windows对应windows操作系统exe可执行文件,darwin对应mac可执行文件,linux对应linux可执行文件,freebsd对应UNIX系统
- GOARCH目标可执行程序操作系统架构,包括386、amd64、arm
- go build 后接编译程序的入口文件
go install
- 编译并安装项目
- 标准格式
- go install [-i] [build flages] [packages]
- 参数与用法跟go build类似
go doc
- 获取go函数帮助文档
- 命令行形式获取某个包的介绍以及包下所有可用的公共方法列表
go doc strconv
- 命令形式获取某个方法的文档
go doc strconv.Itoa
- 使用网页形式查看帮助文档
godoc -http=localhost:6060
- 查看当前系统内go相关的环境变量信息
go env
- Go语言自带的测试工具,会自动读取源码目录下面名为*_test.go的文件,生成并运行测试用的可执行文件
go test
- 原则
- 文件名必须是_test.go结尾的,这样在执行go test的时候才会执行到相应代码
- 必须import testing这个包
- 可执行测试
- 原则
- 所有的测试用例函数必须是Test开头
- 测试用例会按照源代码中写的顺序依次执行
- 测试函数TestXxx()的参数是testing.T,我们可以使用该类型来记录错误或者是测试状态
- 测试格式: func TestXxx(t *testing.T),Xxx部分可以为任意的字母数字的组合,但是首字母不能是小写字母
- 函数中通过调用testing.T的Error,Errorf,FailNow,Fatal,Fatalif方法,说明测试不通过,调用Log方法来记录测试的信息
- 创建测试文件class_test.go
package main
import (
"testing"
"time"
)
func TestHelloWorld(t *testing.T){
timestamp := time.Now().Unix()
t.Log(timestamp)
}
- 执行命令行查看测试结果
go test -v class_test.gp
- 结果
- === RUN TestHelloWorld 表示开始运行名叫 TestHelloWorld 的测试用例
- --- PASS: TestHelloWorld (0.00s) 表示已经运行完 TestHelloWorld 的测试用例, PASS 表示当前方法测试成功,如果是FAIL 表示当前方法测试失败,时间表示这个 测试用例所使用的时间
- ok command-line-arguments 0.005s 表示整体测试结果,ok 表示所有被测试 方法测试通过,如果是FAIL则表示测试失败,command-line-arguments 是测试 用例需要用到的一个包名,0.005s 表示测试花费的时间。
=== RUN TestHelloWorld --- PASS: TestHelloWorld (0.00s) class_test.go:10: 1571237717 PASS ok command-line-arguments 0.005s
5. Go语言关键字
?
关键字使用方式
- var
- 定义变量
// 用于声明变量,声明方式包括以下几种 var name1 int64 var name2 = 15 // 在func内可以使用简写等价,但是简写不可用于声明全局变量,不能在func外面使用 name3 := 15 name4,name5,name6 := "a","b","c" // 同时赋值改多个变量
- const
- 定义常量或常量集
//用于声明常量,可以不用声明类型,对于int类型的常量可以用于int,int64等计算
package main
import "fmt"
const a = 14
func main(){
var b = 16
var c = int64(20)
d := a + b
e := a + c
fmt.Println("d",d)
fmt.Println("e",e)
}
- package
- 用于包声明,在go中包的概念一般指同一个文件夹下的文件,与其它部分语言每个文件可以自己就是一个包不同,包命可以与文件夹名称不同,但是一般建议响应(如果文件夹带有版本号情况可以忽略版本号部分),需要写的程序的可执行文件的第一步 // 这里是注释 package main
- import
- 用于包的引用,引用路径为工作区下的相对路径,如果程序内引用了两个不同路径下相同包名,可以通过设定别名的方式进行区分,如果程序内需要用到引用包的初始化或者接口实现,但是没有显示调用,则需要使用_来进行区分
package main
import (
"context"
echoContext "echo/context"
_ "notuse/context"
)
func main(){
context.Background()
echoContext.text()
}
- func/return
- 定义函数接收返回值
- func
- 函数方法体声明
- 返回参数如果为一个且不带参数名,可以不用写括号
- 返回参数超过一个或者带参数名需要用括号括起来
- return
- 函数方法体返回
- 如果函数返回参数带有参数名称则返回时不需要将每一个参数显示返回,否则血压显示返回
package main
// 无入参,无出参
func main(){
demo1("hello")
demo2("hello",1,2,3)
intArr := []int64{1,2,3}
demo2("hello",intArr...)
demo3()
demo4()
demo5()
demo6()
}
// 有固定入参,无出参数
func demo1(name string){
return
}
// 无固定入参,无出参数
func demo2(name string, params ...int64){
return
}
// 无入参,单参数无名称
func demo3() int64{
return 0
}
// 无入参,单参数有名称
func demo4() (age int64){
return
}
// 无入参,多参数无名称
func demo5() (int64,string){
return 0,""
}
// 无入参,多参数有名称
func demo6() (age int64,name string){
return
}