【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"
}

创建切片时,最好让新切片的长度和容量一样,这样在追加操作时就会生成新的底层数组,从而与原有数组分离,就不会因为共用底层数组,导致修改内容时影响多个切片

posted @ 2023-11-05 23:59  码鸽  阅读(8)  评论(0编辑  收藏  举报