数组
一维
声明 在栈分配内存
var a [10]int //默认都是0/""/false
&a //数组地址,也是a[0]地址;地址间隔按数组类型所占字节决定
初始化
var arr [3]int = [3]int{1, 2, 3}
var arr1 = [3]int{1, 2, 3}
arr2 := [...]int{1, 2, 3}
遍历
常规
range
var arr [3]int = [3]int{1, 2, 3}
for i, v := range arr {
fmt.Printf("%d%d ",i,v)
}
传参
func f(arr *[3]int) {
(*arr)[0] = 1
}
func main() {
var arr [3]int
f(&arr)
}
二维
声明
var a [10][10]int //arr[i]存储地址指向arr[i][0]
初始化
i := [...][2]int{{1,2},{3,4}}
var arr [2][2]int = [...][2]int{{1,2},{3,4}}
var arr = [...][2]int{{1,2},{3,4}}
传参
排序/查找
内部排序:将数据加载到内存排序
- 交换式、选择式、插入式
外部排序:无法全部加载到内存,借助外部存储进行排序
- 合并排序、直接合并排序
冒泡
func main() {
i := [...]int{2, 4, 1, 46, 2, 76}
for j := 0; j < len(i)-1; j++ {
for k := 0; k < len(i)-1-j; k++ {
if i[k] > i[k+1] {
b := i[k]
i[k] = i[k+1]
i[k+1] = b
}
}
}
}
二分
数组有序
func f(n int, arr [5]int, l int, r int) {
if l > r {
fmt.Println("没有")
return
}
m := (r + l) / 2
if arr[m] > n {
f(n, arr, l, m-1)
} else if arr[m] < n {
f(n, arr, m+1, r)
} else {
fmt.Println(m)
}
}
func main() {
n := 5
i := [...]int{1, 3, 5, 8, 9}
f(n, i, 0, len(i)-1)
}
map
key和value可以是:bool、数字、string、指针、channel;包含前面类型的接口、结构体、数组
声明
var a map[keytype]valuetype
初始化
a := make(map[string]string,10) //长度10
b := map[string]string{
"a":"b",
"c":"d",
}
len(b) //2
crud
添加 / 修改
b["e"] = "f"
删除 : key不存在也不报错
delete(b,"a")
查找 : true/false
cities["a"]
遍历
var a map[string]string
a = make(map[string]string, 2)
a["name"] = "hcf"
a["age"] = "21"
for k1, v1 := range a {
fmt.Printf("%s=%s",k1,v1)
}
map切片
初始化
m := make([]map[string]string, 2) //m=[map[] map[]]
m[0] = make(map[string]string, 1)
赋值/修改
m[0]["name"]="hcf" //m=[map[name:hcf] map[]]
append
b := map[string]string{
"a": "b",
"c": "d",
}
m = append(m, b) //[map[name:hcf] map[] map[a:b c:d]]
遍历
for k, v := range m {
fmt.Println(k)
for k1, v1 := range v {
fmt.Printf("%s=%s ", k1, v1)
}
}