Go slice(四)

币来币往 · · 1075 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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]

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:币来币往

查看原文:Go slice(四)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1075 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传