go语言 对数组 切片的理解

本文深入探讨了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中


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Json____

您的鼓励是我创作的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值