数组
go中的数组不同于js中的数组, 容量固定, 不支持自动扩容resize, 数组的长度也是其类型的一部分
创建数组
var arr1 [5]int // 初始化长度为5, 元素类型为int的数组
fmt.Println(arr1) // [0 0 0 0 0]
fmt.Println(cap(arr1)) // 5, 容量
fmt.Println(len(arr1)) // 5, 长度
arr2 := [5]int{1, 2} // 初始化长度为5的, 元素类型为int的数组, 并且制定前两个元素的值
fmt.Println(arr2) // [1 2 0 0 0]
fmt.Println(cap(arr2)) // 5
fmt.Println(len(arr2)) // 5
arr3 := [...]int{1, 2, 3} // 自动识别长度
fmt.Println(arr3) // [1 2 3]
fmt.Println(cap(arr3)) // 3
fmt.Println(len(arr3)) // 3
arr4 := [...]int{0: 1, 4: 5} // 自动识别长度, 并且指定索引为0和4的元素的值
fmt.Println(arr4) // [1 0 0 0 5]
fmt.Println(cap(arr4)) // 5
fmt.Println(len(arr4)) // 5
遍历数组
// for循环遍历
for i := 0; i < len(arr4); i++ {
fmt.Printf("index: %d", i)
fmt.Printf(" value: %d; ", arr4[i])
}
fmt.Println()
// for range遍历
for index, value := range arr4 {
fmt.Printf("index: %d", index)
fmt.Printf(" value: %d; ", value)
}
fmt.Println()
二维数组
// 二维数组, 外层数组的每个元素是长度为2的元素类型为int的数组
arr5 := [...][2]int{
{0, 1},
{2, 3},
{4, 5},
}
fmt.Println(arr5) // [[0 1], [2, 3], [4, 5]]
fmt.Println(cap(arr5)) // 2
fmt.Println(len(arr5)) // 2
切片
切片支持自动扩缩容, 其底层其实是数组
创建切片
var slice1 []int // 声明一个切片
fmt.Println(slice1 == nil) // true, 没有底层数组, 长度和容量为0
fmt.Println(slice1) // []
// fmt.Println(slice1[0]) // panic: runtime error: index out of range [0] with length 0, 越界异常
fmt.Printf("%v", slice1) // []
fmt.Println()
fmt.Printf("%T", slice1) // []int
slice2 := make([]int, 2, 3) // 使用全局的make方式创建一个切片
fmt.Println(slice2) // []int[0 0]
fmt.Println(slice2[0]) // 0
fmt.Println(len(slice2)) // 2
fmt.Println(cap(slice2)) // 3
追加元素
slice1 = append(slice1, 0, 1, 2) // 往切片里追加元素
fmt.Println(slice1) // [0 1 2]
slice1 = append(slice1, slice2...) // 往切片里追加切片, ...类似js里的解构, 但是要放在变量后面
fmt.Println(slice1) // [0 1 2 0 0]
删除元素
toDeleteIndex := 2 // 待删除元素的索引
slice1 = append(slice1[:toDeleteIndex], slice1[toDeleteIndex+1:]...) // [start:end]截取数组, 含头不含尾, 类似js
fmt.Println(slice1) // [0 1 0 0]
浅拷贝元素
slice3 := slice1 // 浅拷贝切片, 共用同一个底层数组
slice3[0] = 100
fmt.Println(slice1) // [100 1 0 0], slice1也被改变了
用go刷力扣第一题
func twoSum(nums []int, target int) []int {
var res []int
for index1, value1 := range nums {
for index2, value2 := range nums {
if (index1 != index2 && value1 + value2 == target) {
res = append(res, index1, index2)
break
}
}
if (len(res) == 2) {
break
}
}
return res
}
这种算法的时间复杂度是O(n^2)的, 后面可以用map把时间复杂度优化成O(n)