GO学习第三天(切片)

指针

func swap(a, b *int) {
	*a, *b = *b, *a
}

函数只有值传递,没有引用

交换值

func main() {
	a, b := 3, 4
	a, b = swap(a, b)
	fmt.Println(a, b)
}

func swap(a, b int) (int,int){
	return b,a
}

数组定义

func main() {
	var arr1 [3]int
	arr2 := [3]int{1, 2, 3}
	arr3 := [...]int{1, 2, 3}
	fmt.Println(arr1, arr2, arr3)
}

:= 必须有初始值

遍历数组

func traversalArr() {
	arr4 := [...]int{1, 2, 3, 4, 5}
	for i := 0; i < len(arr4); i++ {
		fmt.Println(arr4[i])
	}
}

利用range获得数组下标

arr5 := [...]int{1, 2, 3, 4, 5}
for i := range arr5 {
	fmt.Println(arr5[i])
}

利用range直接获得数组元素

	for _, v := range arr5 {
		fmt.Println(v)
	}

数组是值类型

func printArr(arr [3]int) {
	for _, v := range arr {
		fmt.Println(v)
	}
}

  • 在形参时,会拷贝一份。
  • [3]int, [5]int是不同的类型
  • 在GO语言中一般不直接使用数组

切片定义

func main() {
	arr := [...]int{0, 1, 2, 3, 4, 5, 6}
	fmt.Println("arr[1:5]:", arr[1:5])
	fmt.Println("arr[:5]:", arr[:5])
	fmt.Println("arr[1:]:", arr[1:])
	fmt.Println("arr[:]:", arr[:])
}

切片是数组的视图

func updateArr(arr []int) {
	arr[0] = 100
}

func main() {
	arr := [...]int{0, 1, 2, 3, 4, 5, 6}
	fmt.Println(arr)
	updateArr(arr[:])
	fmt.Println("After arr:")
	fmt.Println(arr)
}

切片本身是没有数据的,是对数组的一个view

Slice扩展

	arr := [...]int{0, 1, 2, 3, 4, 5, 6}
	s1 := arr[2:4]
	s2 := s1[1:3]
	fmt.Printf("s1= %v,len(s1)= %d,cap(s1)= %d\n", s1, len(s1), cap(s1))
	fmt.Printf("s2= %v,len(s2)= %d,cap(s2)= %d", s2, len(s2), cap(s2))
  • Slice 可以向后扩展,不可以向前扩展
  • s[i]不可以超过len(s),向后扩展不可以超过底层数组cap(s)

你可能感兴趣的:(GO,GO学习开发)