[js go]数组与切片

266 阅读2分钟

数组

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)