数组简介
- 数组可以存放多个同一类型数据,数组也是一种数据类型,在go中数组是值类型。
- 数组得定义: var 数组名称 [数组大小] 数据类型
go中得数组得使用注意事项
- 数组是多个相同类型数据组合,数组一旦定义了,其长度固定不变,不能动态变化。
- 数组中得元素是可以任何数据类型,包括值类型和引用类型,但是不能混用。
- 数组创建后 如果没有赋值。数组是有默认值得。int 默认0 string 默认空字符串"",bool类型 默认false
- 数组得下标是0开始得【基本大部分语言得数组都是下标0开始得】
- go得数组是值类型,在默认得情况瞎会进行值拷贝。数组之间不会影响
- 如果想在其他函数中,去修改原来得数组。可以使用引用传递。
切片的简介
- 切片数组得一个引用,因此切片得类型为引用类型,所以在值得传递时,遵循引用传递机制。
- 切片得使用和数组类似。切片得长度是可以变化的。所以可以理解为切片是定义一个空数组【类似于php中 $arr=array()】
- 切片定义的基本语法 var 变量名 [] 类型 ;例:var arr [] int
- 切片从底层上来说相当于一个结构体;
type slice struct{
ptr *[2]int
len int
cap int
}
切片的几种声明方式
- 第一种:声明一个未指定大小的数组来定义切片
package main
import (
"fmt"
)
func main() {
//声明一个未指定大小的数组来定义切片
var slice []int
//直接这样赋值是不行的,会报索引超出范围的错误
// slice[0] =4
//这种情况需要append函数来追加数据
slice = append(slice, 1)
slice = append(slice, 2)
slice = append(slice, 3)
//可以这样在已有的索引范围内重新赋值,slice[3]=5 这样是不行的。
slice[2] =4
//打印结果 slice: [1 2 4]
fmt.Printf("slice: %v
", slice)
}
- 第二种:使用make函数来声明一个切片
package main
import (
"fmt"
)
func main() {
//声明一个未指定大小的数组来定义切片
//make(切片的类型,切片的长度,切片的容量)
var slice []int=make([]int, 10,20)
//打印结果:slice: [0 0 0 0 0 0 0 0 0 0]
fmt.Printf("slice: %v
", slice)
}
- 第三种:使用make函数来声明一个切片
package main
import (
"fmt"
)
func main() {
//直接进行赋值;类似于make
var slice []int=[]int{
1,2,3}
//打印结果:slice: [1 2 3]
fmt.Printf("slice: %T
", slice)
}
- 第四种:引用数组的方式创建切片
package main
import (
"fmt"
)
func main() {
//引用数组的形式
var arr [6]int = [...]int{
1, 2, 3, 4, 5, 6}
slice := arr[1:4]
//打印结果:slice: [2 3 4]
fmt.Printf("slice: %v
", slice)
}