【一Go到底】第二十七天---数组注意事项及细节

123 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情

一、注意事项和细节

  1. 数组是多个相同类型数据的组合,,一个数组一旦声明/定义了,其长度是固定的,不能动态变化。详见细节一(2.1)
  2. var arr [int] 这时arr就是一个slice切片
  3. 数组中的元素可以是任何数据类型,包括值类型和引用类型,但是不能混用。
  4. 数组创建后,如果没有赋值,有默认值。详见细节二(2.2)
  • 数值类型数组:默认值为0
  • 字符串数组: 默认值为 ""
  • bool数组: 默认值为false
  1. 使用数组的步骤
    1. 声明数组并开辟空间
    1. 给数组各个元素赋值3使用数组
  1. 数组的下标是从0开始的。
  2. 数组下标必须在指定范围内使用,否则报panic: 数组越界,比如var arr [5]int则有效下标为0-4
  3. Go的数组属于值类型,在默认情况下是值传递,因此会进行值拷贝。数组间不会相互影响
  4. 如想在其它函数中,去修改原来的数组,可以使用引用传递(指针方式) 。详见细节三(2.3)
  5. 长度是数组类型的一部分,在传递函数参数时,需要考虑数组长度,不同数组长度不能传递。详见细节四(2.4)

二、案例演示

2.1 细节一

package main

import "fmt"

func main() {
	// 数组是多个相同数据类型的组合,一个数组一旦声明,其长度是固定的,无法动态变化
	var arr01 [3]int
	arr01[0] = 1

	// arr01[1] = 2.2 //会报错,类型不符
	arr01[2] = 3

	// arr01[3] = 4 // 报错,越界

	// arr01 =  [1 0 3]
	fmt.Println("arr01 = ", arr01)
	
}

2.2 细节二

package main

import "fmt"

func main() {

	// 数组类型默认值
	// 数值类型 0
	// 字符串类型 ""
	// bool类型  false

	arr01 := [3]float32{}
	arr02 := [3]string{}
	arr03 := [3]bool{}
	// 数值型数组 =  [0 0 0]
	// 字符型数组 =  [  ]
	// 布尔型数组 =  [false false false]
	fmt.Println("数值型数组 = ", arr01)
	fmt.Println("字符型数组 = ", arr02)
	fmt.Println("布尔型数组 = ", arr03)
}


2.3 细节三

package main

import "fmt"

// 定义函数
func testArr(arr *[3]int) {
	(*arr)[0] = 100
}

func main() {
	// 引用传递
	arr := [3]int{11, 22, 33}
	testArr(&arr)
	// main arr =  [100 22 33]
	fmt.Println("main arr = ", arr)

}

2.4 细节四

2.4.1 错误一

package main

import "fmt"

func arrfc(arr []int) {
	arr[0] = 100
	fmt.Println("arr函数中的 arr = ", arr)
}

func main() {
	arr := [...]int{1, 2, 3}
	// 报错
	// .\main.go:12:8: cannot use arr (variable of type [3]int) as type []int in argument to arrfc
	// mian中的arr是 [3]int类型的,不能将其传递给 arrfc []int
	arrfc(arr)
}


2.4.2 正确案例

package main

import "fmt"

func arrfc(arr [3]int) {
	arr[0] = 100
	fmt.Println("arr函数中的 arr = ", arr)
}

func main() {
	arr := [...]int{1, 2, 3}
	// arr函数中的 arr =  [100 2 3]
	arrfc(arr)
}