2.6 数组
Go中的数组使用较少,更多使用切片,因为数组的长度是固定的 数组用法与C++中类似,也可以定义多维数组,要注意的是Go中的数组同C++一样是从0开始到N-1的,如果遍历到N会越界
var a [5]int
for i := 0; i <= 4; i++ {
a[i] = i
}
for i := 0; i <= 4; i++ {
fmt.Println(a[i])
}
2.7 切片(Slice)
切片不同于数组,是一个可变长度的数组(动态数组),类似于C++中的vector
2.7.1切片的声明
切片的声明一般用make函数,格式为 "变量名" + ":=" + "make([]类型名, 切片初始大小)" 其中整型的初始值是0,字符串的初始值是空格
a := make([]int, 5)
s := make([]string, 6)
2.7.2切片追加元素
在切片末尾追加元素,有点类似C++中的push_back,使用append函数时要注意必须把append的值赋值回原数组,切片大小也跟着改变
a := make([]int, 5)
a = append(a, 5, 6, 7, 8)
fmt.Println(a)
2.7.3 切片的复制
可以使用copy来复制一个数组的值到另一个数组,如果被复制的数组长度大于复制的将会只复制一部分值
a := make([]int, 5)
a = append(a, 5, 6, 7, 8)
b := make([]int, len(a))
copy(b, a)
2.7.4 切片操作
感觉跟MATLAB和Python差不多,这样输出会很方便
fmt.Println(b[2:3])
fmt.Println(b[:3])
fmt.Println(b[2:])
2.8 map(哈希/字典)
使用make函数来定义map,与C++中的map差不多
mp := make(map[int]int)
mp[1] = 2
mp[2] = 3
使用第二个值来查询键值对有没有被赋值过,其中ff返回一个布尔型的变量
val,ff := mp[3]
fmt.Println(val,ff)
删除键值对时使用delete函数
delete(mp,1)
2.9 range
range 可以用来遍历切片,map等集合,使代码更加简洁
在遍历切片时,可以用两个变量来获取索引及该索引上的值,如不需要获取索引可以用下划线代替
a := []int{1,2,3,4}
for idx,val := range a{
fmt.Println(idx,val)
}
在遍历map时,第一个值是key,第二个值是value,单个值时只获取key
mp := map[string]int{"a": 1, "b": 2}
for k, v := range mp {
fmt.Println(k, v)
}
2.10 函数
与C++中的函数大致相同,只是类型声明后置,
package main
import (
"fmt"
)
func mian(a, b int) int {
return a * b
}
func main() {
a := mian(4, 6)
fmt.Println(a)
}
函数也同样可以返回多个值
package main
import (
"fmt"
)
func test_mian(a, b int) (ans int, ok bool) {
ans = b
ok = false
return ans, ok
}
func main() {
a, ff := test_mian(4, 6)
fmt.Println(a, ff)
}
2.11 结构体
具体用法与C++大致相同,可以在定义时就把结构体内变量赋值,使代码更简洁
package main
import (
"fmt"
)
type Node struct {
name string
point int
}
func main() {
d := Node{name: "Go", point: 100}
d.point = 99
fmt.Println(d.name, d.point)
}
总结
在Go中,数组是固定长度的,索引从0开始。切片是动态数组,使用make函数进行声明,可通过append进行元素追加,还可以使用copy进行复制,支持切片操作,类似MATLAB和Python。使用make函数可以定义映射(map),用于存储键值对。通过查询返回的第二个值可以判断是否存在该键。使用delete函数可删除键值对。在循环遍历方面,range可用于遍历切片、映射等集合,使代码简洁。对于切片,可以同时获取索引和值,而在映射中,第一个值是键,第二个值是值。函数的定义类似C++,可以返回单个值或多个值。结构体定义也类似C++,可以在声明时进行初始化。