【go笔记】
《打开Go语言之门》——飞雪无情
1-入门
1.1 环境配置
添加环境变量GOPATH和GOBIN
GOPATH = <go的安装位置>
GOBIN = $GOPATH/bin
1.2 项目结构
首先需要在项目的根目录下执行
go mod init <这里应该随便起个名字就行>
执行之后,根目录下会多出一个go.mod
文件,用记事本打开
里面的内容是
module testmod
go 1.21.3
testmod就是<这里应该随便起个名字就行>的内容
如果go mod init
后面不加名字,则会出现报错go: cannot determine module path for source directory <项目路径> (outside GOPATH, module path must be specified)
然后就可以在项目的根目录下写go文件了。
1.3 编译
直接编译
在项目的根目录下执行go build ./main.go
可以得到同名的可执行文件main.exe
。
执行go install ./main.go
则会将文件编译后放置在GOBIN路径下。
跨平台编译
终端执行go env
查看计算的编译环境
通过GOOS(操作系统)和GOARCH(处理器架构)两个变量可以控制编译输出的可执行文件类型。
例如:
GOOS=linux GOARCH=amd64 go build ./main.go
更多GOOS和GOARCH参考官方文档的“GOOS and GOARCH”这一节。
2-变量
2.4 常量
常量一旦确定就不能更改
// 自动推导类型
const name = '码农'
// 一次性声明多个常量
const (
one = 1
two = 2
three = 3
)
// 使用常量生成器iota,iota的初值为0,往下逐渐递增
const (
one = iota + 1
two
three
)
2.5 字符串
// 与数字类型互转
import "strconv"
i2s := strconv.Itoa(i) // int转string
s2i, err := strconv.Atoi(i2s)
4-集合类型
4.1 数组
声明
// 声明并初始化数组
sa := [3]string{"hah", "码农", "996"}
// 当数组内容全部初始化时,可以省略[]中的数值
sa := [...]string{"hah", "码农", "996"}
// 可以在声明时部分初始化,对于没有初始化的索引,默认为零值,即""
sa := [3]string{1: "码农"} // 1:表示在索引为1处初始化为"码农"
数组循环
// 使用for range语句进行数组循环
sa := [...]string{"408", "数学1"}
for i,v := range sa{ // range <数组名> 返回两个值,第一个是索引,第二个是对应的数组值
fmt.Println(i, v)
}
// 若返回的值用不到,可以用下划线(_)丢弃
sa := [...]string{"408", "数学1"}
for _,v := range sa{ // range <数组名> 返回两个值,第一个是索引,第二个是对应的数组值
fmt.Println(v)
}
4.2 切片
基于数组生成切片
切片的底层是数组
// 基于数组生成切片
sa := [...]string{"408", "数学1", "英语1", "政治", "数据库"}
slice := sa[2:4] // 2:4为左闭右开区间,即[2, 4)
for _, v := range slice{
fmt.Println(v) // 输出:英语1 政治
}
// 可以省略start或者end
sa[:4] // 等价于sa[0:4]
sa[1:] // 等价于sa[1:5]
sa[:] // 等价于sa[0:5]
切片由三个字段组成
data | len:2 | cap:3 |
---|---|---|
指向数组元素 | 切片的长度(此例为2,即有两个元素) | 切片的容量 |
对切片的修改会导致原数组的值也发生变化
sa := [...]string{"408", "数学1", "英语1", "政治", "数据库"}
slice := sa[2:4]
slice[0] = "软件工程"
fmt.Println(sa) // 输出:[408 数学1 软件工程 政治 数据库]
切片的声明
除了基于数组生成,也可以直接声明切片
slice1 := make([]string, 4) //声明长度为4的string切片
slice2 := make([]string, 4, 9) // 声明长度为4,容量为9的string切片
// 字面量声明
slice3 := []string{"数据结构", "计算机组成原理", "计算机网络", "操作系统"}
// 可以用append给原有的切片追加元素,并返回新切片
slice4 := make([]string, 2, 3)
// new_slice = append(slice,string1,string2)
// 或者new_slice = append(slice1,slice...)
slice5 := append(slice4, "nihao")
for i, v := range slice5{
fmt.Println(i, v) // 返回 0 1 2 "nihao"
}
创建切片时,最好让新切片的长度和容量一样,这样在追加操作时就会生成新的底层数组,从而与原有数组分离,就不会因为共用底层数组,导致修改内容时影响多个切片