• go语言学习之路三:切片


      前面讲了变量的有关知识,这里对于其他的数据类型就不多作介绍,(和C差不多),因此重点来讨论下切片。

    一、切片是引用类型,这里要稍微介绍两个概念:值类型,构造类型和引用类型

      1、值类型:是一种由类型的实际值表示的数据类型。如果向一个变量分配值类型,则该变量被附以全新的值的副本,go语言的值类型包括布尔型,整型,浮点型,复数型。

      2、构造类型:和c中差不多,包括数组,结构体和字符串

      3、引用类型:由类型的实际值引用表示的数据类型。如果为某个变量分配一个引用类型,则该变量将应用原始值,不创建任何副本。go语言引用类型包括切片、字典和通道。

      切片通常用来实现变长数组,原型定义如下:

    struct Slice

    {

      byte *array;

      unit32 len;

      unit32 cap;

    };

    它抽象为以下三个部分:

      指向被引用的底层数组的指针;切片中元素的个数;切片分配的存储空间。

    二、切片的创建和声明

      1、基于底层数组创建切片

      var array1=[10]int{1,2,3,4,5,6,7,8,9,10}

      var slice[]int

      slice1=array1[:5]

      slice2=array1[5:]

      slice3=array1[:]

      slice4=array1

      slice5=array1[0:len(array1)]

      自己添加package和import和func main将上面的代码运行下看看效果,理解基于底层数组创建切片。

      2、直接创建切片

      var slice = []int{1,2,3,4,5}

      3、使用make函数创建切片

      var slice=make([]int,5)//创建一个有5个元素的整型切片slice,元素的初始值为0。

      在使用make()函数创建切片时,还可以为切片元素预留存储空间:

      var slice=make([]int,5,10)//创建一个有5个元素的整型切片slice,元素的初始值为0,并且预留10个元素的存储空间。

    三、切片元素的访问和遍历

      切片的访问和数组元素的访问一样,通过元素下表访问,或者使用range遍历所有切片元素.例:

    var slice=[]int{1,2,3,4,5}

    for i:=0;i<=4;i++{

      fmt.Println(i,slice[i])

    }

    for i,v:=range slice{

      fmt.Println(i,slice[i])

    }

    四、切片的操作

      1、切片元素的增加

      使用append()函数向切片尾部添加新元素:

    s := make([]string, 3)
    fmt.Println("emp:", s)
    s[0] = "a"
    s[1] = "b"
    s[2] = "c"

    s = append(s, "d")
    s = append(s, "e", "f")
    fmt.Println("apd:", s)
    2、切片的复制:
    var slice1=[]int{1,2,3,4,5,6,7,8,9,10}
    var slice2=make([]int,3,5)
    var n int
    n=copy(slice2,slice1)
    fmt.Println(n,slice2,len(slice2),cap(slice2))

    slice3:=slice[3:6]
    n=copy(slice3,slice1[1:5])
    fmt.Println(n,slice,slice3)
    这段代码需要读者好好研究研究,这可以加深对slice引用的是底层数组的理解,运行的结果是:
    3 [1 2 3] 3 5
    3[1 2 3 2 3 4 7 8 9 10] [2 3 4]
    见下图:

  • 相关阅读:
    新人,请多指教,有个java小问题: bety a=300,强制类型转换,分析我的做法是否正确?谢谢
    生活健康
    小涛涛
    学习笔记(三)
    学习笔记(二)
    学习笔记(一)
    子元素宽度为100%,缩小窗口,父元素出现横向滚动条,滚动条向右拉,父元素右边有一块空白区域,没有背景颜色
    word-wrap:break-word和word-break:break-all的区别
    链接link使用href=“#”和href="##"的区别
    C#中在路径前使用 @ 的作用
  • 原文地址:https://www.cnblogs.com/chase-wind/p/5625855.html
Copyright © 2020-2023  润新知