初面网初面网

数组、切片和Map

数组与切片

数组长度是类型的一部分。也就是说,长度为4的数组和长度为5的数组的类型是不相等的。

数组是值类型

声明

// 定长
var a [3]int
var b = [3]int{1,2,3}
var d := [...]int{0: 1, 5: 7}   // 指定下标。长度是最大的下标值+1

// 变长
var c := [...]int{23,44} // 像这里已经给定了两个长度的值,但是
fmt.Println(c[2])       // 这里的c[2]是出界的,因为在给定值的时候该数组仍旧是定长的

// 多维
var e = [2][2]int{
  {1,2},
  {3,4}
}

遍历数组

var a := [...]{1,2,3}

for i := 0; i< len(a); i++ {
  fmt.Println(a[i])
}

for k,v := range arr {
  fmt.Printf("key: %v value: %v\n", k, v)
}

动态的数组的话就是切片

切片是引用类型

var arr1 = []int    // 未赋值默认为nil
var arr2 = []int{1,2,3}
var arr2 = []int{0: 1, 1: 2, 2: 3}

// 基于数组定义切片
a := [5]int{1,2,3,4,5}
b := a[:]   // 获取数组里面的所有值

// 基于切片的切片
a := []int{1,2,3,4,5}
b := a[1:]   // 其实和基于数组的切片是一样的,只是写了获取范围

// 范围取值
c := a[1:3] // 左包右不包。获取下标1到下标3的值
// c := a[:3]  // 获取第一个值到下标3的值
// c := a[1:]  // 获取下标1到最后一个的值

// 长度与容量
fmt.Printf("长度%d 容量%d", len(a), cap(a)) // len()获取长度,cap获取容量
// 长度是元素的个数
// 容量是底层数组的个数
// 例如上面的c := a[1:3],结果是{2,3},那么长度是2,但容量是要拿着起始下标到原数组里看的。这里的起始下标是1,那么回到原数组,从下标1开始到末尾的所有值都是底层数组,所以{2,3,4,5}是底层数组,容量便是4

// 扩容
var slice0 []int    // 空的切片,长度0,容量0
// slice0[0] = 1    // 这样写会报错
slice0 = append(slice0, 1)  // 扩容必须用append
slice0 = append(slice0, 2)
slice0 = append(slice0, 3)
fmt.Println(slice0) // [1 2 3]
slice0 = append(slice0, 4,5,6)
fmt.Println(slice0) // [1 2 3 4 5 6]

// 注意,扩容会自动增加切片容量,增加的数值有算法,在附录中详述

// 合并
var slice1 []int

slice1 = append(slice1, slice0...)  // 将slice0合并到slice1

// 删除元素
var slice3 := []int{1,2,3,4,5,6}

// 删除下标2元素
slice3 = append(slice3[:2],a[3:]...)

make()声明切片

// make([]T, size, cap)
// T: 切片的元素类型
// size: 切片中元素的数量
// cap: 切片的容量

var slice1 = make([]int, 4, 8)
fmt.Printf("长度: %d, 容量: %d", len(slice1), cap(slice1))
slice1[0] = 10
fmt.Println(slice1)

copy()函数复制切片

a := []int{1,2,3}
b := make([]int, 4,4)
copy(b,a)

map

map是无序的键值对数据结构,属于引用类型。

声明

// map[KeyType]ValueType
// 方法一
var userinfo = make(map[string]string)
userinfo["uname"] = "张三"

// 方法二
var userinfo = map[string]string{
    "uname": "tom",
    "uage": 18
}
// 方法三
userinfo := map[string]string{
    "uname": "tom",
    "uage": 18
}

查找

userinfo := map[string]string{
    "uname": "tom",
    "uage": 18
}

v, ok := userinfo["uage"]

删除

userinfo := map[string]string{
    "uname": "tom",
    "uage": 18,
    "sex": "man",
}

delete(userinfo, "sex")

更新于 2026/8/13