go语言 对数组 切片的理解

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中


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章