golang slice

golang 在for range一个slice时,会读出其cap长度。在for的过程中,即使动态append该slice,最终for也会在第一次读取的cap长度处停止。

package main

import (
    "fmt"
)

func main() {
    s := make([]string, 3)
    s[0]="a"
    s[1]="b"
    s[2]="c"

    for _,i := range s {
        s = append(s, s[0])
        fmt.Println("len", len(s))
        fmt.Println("cap", cap(s))
        fmt.Println("i", i)
        fmt.Println("s", s)
    }

    s = append(s, "e")
    fmt.Println(">>>len", len(s))
    fmt.Println(">>>cap", cap(s))
    fmt.Println(">>>s", s)
}

输出为:

len 4
cap 6
i a
s [a b c a]
len 5
cap 6
i b
s [a b c a a]
len 6
cap 6
i c
s [a b c a a a]
>>>len 7
>>>cap 12
>>>s [a b c a a a e]
 
时间: 2024-12-07 15:41:14

golang slice的相关文章

golang slice性能分析

golang在gc这块的做得比较弱,频繁地申请和释放内存会消耗很多的资源.另外slice使用数组实现,有一个容量和长度的问题,当slice的容量用完再继续添加元素时需要扩容,而这个扩容会把申请新的空间,把老的内容复制到新的空间,这是一个非常耗时的操作.有两种方式可以减少这个问题带来的性能开销: 在slice初始化的时候设置capacity(但更多的时候我们可能并不知道capacity的大小) 复用slice 下面就针对这两个优化设计了如下的benchmark,代码在: https://githu

Golang Slice 总结

数组 Go的切片是在数组之上的抽象数据类型,因此在了解切片之前必须要要理解数组.数组类型由指定和长度和元素类型定义.数组不需要显式的初始化:数组元素会自动初始化为零值:Go的数组是值语义.一个数组变量表示整个数组,它不是指向第一个元素的指针(比如C语言的数组).当一个数组变量被赋值或者被传递的时候,实际上会复制整个数组.(为了避免复制数组,你可以传递一个指向数组的指针,但是数组指针并不是数组.)可以将数组看作一个特殊的struct,结构的字段名对应数组的索引,同时成员的数目固定. 切片 数组虽然

golang slice去重

golang内没有类似python中集合的数据结构,所以去重这样的运算只能自己造轮子了. 随手写了两个示例,一个是string类型的,一个是int类型的 package main import "fmt" func main() { s1 := []string{"111", "aaa", "bbb", "ccc", "aaa", "ddd", "ccc&q

【转】 golang slice array

1. array   同一类型数据的集合     var arr [n]type    //声明type类型一维数组     var arr [m][n]type //声明type类型二维数组     多维数组以此类推     也可以用 := 声明     arr := [n]type{元素1[,元素2, ...]} 其中n可以用 "..." 三个点表示,系统会根据元素个数来确定   下标只能为 int 类型,而 php 还支持 string 类型的下标   1.1 数组长度 len(

Golang Slice切片

1. 切片的定义和初始化 切片是基于数组类型的封装,非常灵活,可以自动扩容 切片是真正意义上的动态数组,而且是一个引用类型,切片指向一个底层数组 定义切片 var 切片名[] 切片类型 创建切片方式 package main import "fmt" func main() { // 1. 声明切片 var s1 []int if s1 == nil { // 只声明没有初始化,所以是nil fmt.Println("为空") } else { fmt.Printl

go语言slice的理解

Golang slice yongsean  作者 2017.02.17 00:07  打开App 创建切片,len.cap.append b := make([]int, 5) println(len(b), cap(b)) // 输出结果是:5, 5 fmt.Println(b) // 输出结果是:[0 0 0 0 0] 上述代码是生成默认占用5个0值的切片,下面的输出结果是另一回事 b := make([]int, 0, 5) println(len(b), cap(b)) // 输出结果

深度解密Go语言之Slice

目录 当我们在说 slice 时,到底在说什么 slice 的创建 直接声明 字面量 make 截取 slice 和数组的区别在哪 append 到底做了什么 为什么 nil slice 可以直接 append 传 slice 和 slice 指针有什么区别 总结 参考资料 Go 语言的 slice 很好用,不过也有一些坑.slice 是 Go 语言一个很重要的数据结构.网上已经有很多文章写过了,似乎没必要再写.但是每个人看问题的视角不同,写出来的东西自然也不一样.我这篇会从更底层的汇编语言去解

Golang:slice之append时原数组发生变化的问题

使用append可以在slice之后追求元素,例如 nums:=[]int{1,2,3} result:=append(nums,4) fmt.Println(result) 这段代码很简单,输出result的值为:[1 2 3 4] 问题在于,进行这种操作时,原来的slice(即nums)所基于的数组的值会不会发生变化呢?在Golang中,如果有多个slice基于了同一个数组,则这些slice的数据是共享的(而不是每个slice复制一份).也就说,如果改变了数组的内容,则基于它的所有slice

golang的slice作为函数参数传值的坑

直接贴代码 func sliceModify(slice []int) { // slice[0] = 88 slice = append(slice, 6) } func main() { slice := []int{1, 2, 3, 4, 5} sliceModify(slice) fmt.Println(slice) } 返回的没变,坑爹的,这个设计太那啥了,可以正确跑出效果的版本如下: func sliceModify(slice *[]int) { *slice = append(*