Go slice(四)

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

内容简介: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]

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

查看所有标签

猜你喜欢:

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

jQuery实战(第2版)

jQuery实战(第2版)

[美]Bear Bibeault、[美]Yehuda Katz / 三生石上 / 人民邮电出版社 / 2012-3 / 69.00元

jQuery 是目前最受欢迎的JavaScript/Ajax 库之一,能用最少的代码实现最多的功能。本书全面介绍jQuery 知识,展示如何遍历HTML 文档、处理事件、执行动画、给网页添加Ajax 以及jQuery UI 。书中紧紧地围绕“用实际的示例来解释每一个新概念”这一宗旨,生动描述了jQuery 如何与其他工具和框架交互以及如何生成jQuery 插件。 本书适合各层次Web 开发人......一起来看看 《jQuery实战(第2版)》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

html转js在线工具
html转js在线工具

html转js在线工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具