Go slice(四)

栏目: Go · 发布时间: 6年前

内容简介:Golang的数据声明格式如下data := [7]int{}data:=[3]int{1, 2, 3}

Golang的数据声明格式如下

data := [7]int{}

data:=[3]int{1, 2, 3}

data := [...]int{1, 2, 3}

我们注意到,与其他语言不同的是数组的大小放在前面。

Go 语言的数组当做参数时,是值传递,即会copy数组中的所有数据。

所以在实际的 go 语言开发中其实很少使用数组,而是使用slice.

所以下面我们重点介绍一下slice

data := []int{}

data := []int{1,2, 3}

slice的声明和array类似,只是省略了大小或者'...'

当slice的空间不足时,它就会自动将存储空间增加一倍。

可以用len(data)获取slice中数据的长度,用cap(data)获取slice的容量(capacity).

func printSlice(data []int){
    for _, ele := range data{
        fmt.Print(ele, " ")
    }
    fmt.Println()
}

func main(){
    data := []int{1,2,3,4}
    printSlice(data)
    fmt.Printf("Capacity: %d, Length: %d\n", cap(data), len(data))
    data = append(data, 10)
    printSlice(data)
    fmt.Printf("Capacity: %d, Length: %d\n", cap(data), len(data))

}

------------------------------------------
//result
1 2 3 4 
Capacity: 4, Length: 4
1 2 3 4 10 
Capacity: 8, Length: 5

上述代码生声明一个slice, 初始容量和数据长度都是4,然后通过append在slice后面动态添加了一个数据10, 此时由于容量已经等于已有数据长度,即slice已满,所以需要动态扩容, go扩容方案是直接在原来的基础上加倍 , 所以我们看到长度增加了1,但是容量增加了4

所以这里需要注意的就是,如果slice容量已经很多,且满了。那么此时添加一条记录的代价将是非常高的。

我们也可以通过make函数来生成slice. 通过make函数还可以指定slice的初始大小

data := make([]byte, 5)

*说到make,这里我们提一下go语言的内存分配, go 有两个内建函数来分配内存,new 和make. 两者的区别是,new只是分配存储空间,make则主要用于slice, map, channel的初始化

copy() 函数

copy(dst, src): copy函数将src slice的数据拷贝到dst slice里面

其中,

  • dst, src必须是slice, 如果是array,则必须通过array[0:] 转换成slice
  • copy时,src数据会覆盖dst里面原来的数据, 如果src数据量小于dst数据量,那么dst里面会有一部分数据不被覆盖;如果src数据量大于dst,那么将只copy dst.length长度的src数据
    我们通过下面的实例来体会一下
package main

import "fmt"

func main(){
    a6 := []int{1,2,3,4,5,6}
    a4 := []int{-1,-2,-3,-4}

    fmt.Println("a6:", a6)
    fmt.Println("a4:", a4)

    copy(a6, a4)
    fmt.Println("copy a4 to a6, ", a6)
    fmt.Println()

    a6 = []int{1,2,3,4,5,6}
    a4 = []int{-1,-2,-3,-4}
    copy(a4, a6)
    fmt.Println("copy a6 to a4, ", a4)
    fmt.Println()

    array5 := [5]int{5,-5,5,-5,5}
    s7 := []int{7,7,7,7,7,7,7}
    fmt.Println("array5 ", array5)
    fmt.Println("s7 ", s7)
    copy(array5[0:], s7)
    fmt.Println("copy s7 to array5 ", array5)
}

--------------------------------------------
//result
a4: [-1 -2 -3 -4]
copy a4 to a6,  [-1 -2 -3 -4 5 6]

copy a6 to a4,  [1 2 3 4]

array5  [5 -5 5 -5 5]
s7  [7 7 7 7 7 7 7]
copy s7 to array5  [7 7 7 7 7]

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Perl语言编程

Perl语言编程

克里斯蒂安森 (Tom Christiansen) (作者)、Brian D Foy (作者)、Larry Wall (作者)、Jon Orwant (作者) / 苏金国 (译者)、吴爽 (译者) / 中国电力出版社 / 2014-9-1 / 148

从1991年第一版问世以来,《Perl语言编程》很快成为无可争议的Perl宝典,如今仍是这种高实用性语言的权威指南。Perl最初只是作为一个功能强大的文本处理工具,不过很快发展成为一种通用的编程语言,可以帮助成千上万的程序员、系统管理员,以及像你一样的技术爱好者轻松完成工作。 人们早已经翘首以待这本“大骆驼书”的更新,如今终于得偿所愿。在这一版中,三位颇有声望的Perl作者讲述了这种语言当前......一起来看看 《Perl语言编程》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具