数组
数组是一个具有相同数据类型
的元素组成的固定长度
的有序集合
。比如下面的例子
var x [5]int
表示数组x是一个整型数组,而且数值的长度为5。Go提供了几种不同的数组定义方法。
定义后初始化
数组元素定义后,初始值默认为零值
package main
import "fmt"
func main() {
var x [5]int
// or var x =[5]int{}
for i := 0; i < 5; i++ {
x[i] = i
}
for i := 0; i < 5; i++ {
fmt.Printf("x[%d] = %d\n", i, x[i])
}
}
定义时初始化
package main
import "fmt"
func main() {
var x = [5]int{0, 1, 2, 3, 4} //注意写法
for i := 0; i < 5; i++ {
fmt.Printf("x[%d] = %d\n", i, x[i])
}
}
不带长度初始化
package main
import "fmt"
func main() {
var x = [...]string{
"a",
"b",
"c",
}
/* or
var x = [...]string{
"a",
"b",
"c"}
*/
for i := 0; i < 3; i++ {
fmt.Println(x[i])
}
}
切片
切片可以看成是不定长的数组,需要注意的是,切片是引用类型。
创建切片
创建切片有几种方法
var x = []T{args}
var x = make([]T,len,cap)
var x = make([]T,len)
var x = A[l:r] //A 是一个数组,得到的x初始值为{a[l]...a[r-1]}
append
x = append(x,arg1,arg2....)
x = append(slice1,slice2...) //后面的三个点不可少,表示拆开
注意:切片会引用创建时候的底层数组,对切片的操作会直接作用在底层数组上,如果当前操作超过了底层数组的容量那么就会创建一个新的底层数组。这也就是为什么append
一定要求接受返回值。
copy
copy(aim,source) //取min(len(aim),len(source))
删除
go中没有切片删除元素的内置函数,我们可以通过切片来完成
var x =[]int{1,2,3,4}
x = append(a[:i],a[i+1:]...) //删除第i个元素
排序
可以用sort包对切片进行排序,如果是数组要先转换为切片
package main
import (
"fmt"
"sort"
)
func main() {
s := []int{5, 2, 1, 4, 3}
sort.Ints(s[:])
fmt.Println(s)
}
字典
创建字典
字典是引用类型,所以要声明指针后还要创建空间
创建带初始值的字典
var M = map[string]int{
"A",1,
"B",2,
"C",3,
}
不带初始值的字典
var x = make(map[string]string)
x := make(map[string]string)
查询
查询的返回值有两个,val
和exist
,如果不存在那么val
为零值,exist
为false
package main
import "fmt"
func main() {
x := make(map[string]string)
x["a"] = "A"
if _, ok := x["b"]; !ok {
fmt.Print("Has not b")
}
}
删除
Go提供了内置函数delete
package main
import "fmt"
func main() {
x := make(map[string]string)
x["a"] = "A"
delete(x, "a")
if _, ok := x["a"]; ok {
fmt.Print("Has a")
} else {
fmt.Print("Has no a")
}
} //Has no a