package main
import "fmt"
func modify(array [5]int){
array[0]=10
fmt.Println("----------",array)
}
func main(){
array:=[5]int{1,2,3,4,5}
modify(array)
//:数组的长度在定义之后无法再次修改;数组是值类型,
// 每次传递都将产生一份副本
fmt.Println("========",array)
/*
数组切片就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是
个指针。数组切片的数据结构可以抽象为以下3个变量:
一个指向原生数组的指针;
数组切片中的元素个数;
数组切片已分配的存储空间
*/
//创建数组切片 两种形式 基于数组和直接创建
//1.基于数组
//定义数组 var 定义 := 赋值
var myArray = [10]int{1,2,3,4,5,6,7,8,9,10}
//基于数组创建一个切片
var mySlice []int=myArray[2:5]
fmt.Println("Elements of myArray: ")
for _, v := range myArray {
fmt.Print(v, " ")
}
fmt.Println("\nElements of mySlice: ")
for _, v := range mySlice {
fmt.Print(v, " ")
}
fmt.Println()
//2.直接创建切片
//可以使用 make 这个函数创建数组切片
//创建一个初始元素个数为5的数组切片元素初始值为0:
mySlice1 :=make([]int,5)
fmt.Println(mySlice1)
//创建一个初始元素个数为5的数组切片,元素初始值为0,并预留10个元素的存储空间:
mySlice2 :=make([]int,5,10)
fmt.Println(mySlice2)
//直接创建并初始化包含5个元素的数组切片:
mySlice3 := []int{1, 2, 3, 4, 5}
fmt.Println(mySlice3)
//元素遍历
for i:=0;i<len(mySlice);i++{
fmt.Println("key",i,"-----","val",mySlice[i])
}
//可以使用 range 关键字 让遍历代码更简洁
for k,v:=range mySlice{
fmt.Println("key",k,"=========","val",v)
}
//动态增减元素
//可动态增减元素是数组切片比数组更为强大的功能
//数组切片多了一个存储能力
fmt.Println("len长度:",len(mySlice2))
//获取数组的的空间大小
fmt.Println("cap空间大小:",cap(mySlice2))
//继续追加元素
//一个一个追加
mySlice2 = append(mySlice2,11,12)
fmt.Println(mySlice2)
//数组追加
/*
在第二个参数mySlice2后面加了三个点,即一个省略号,如果没有这个省
略号的话,会有编译错误,因为按append()的语义,从第二个参数起的所有参数都是待附加的
元素。因为mySlice中的元素类型为int,所以直接传递mySlice2是行不通的。加上省略号相
当于把mySlice2包含的所有元素打散后传入。
*/
mySlice4 :=[]int{13,14}
mySlice2=append(mySlice2,mySlice4...)
fmt.Println(mySlice2)
//内容复制
//数组切片支持GO语言的另一个内置函数 copy 用于将内容从一个数组切片复制到另一个
//数组切片。如果加入的两个数组切片不一样大,就会按其中较小的那个数组切片的元素个数进行复制
slice1 :=[]int{1, 2, 3, 4, 5}
slice2 :=[]int{5, 4, 3}
copy(slice1,slice2)//只会复制slice2的3个元素到slice1的前3个位置
copy(slice2,slice1) // 只会复制slice1的前3个元素到slice2中
}
go语言 对数组 切片的理解
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.