温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Golang中怎么利用Slice对append进行扩容

发布时间:2021-06-23 17:27:51 来源:亿速云 阅读:267 作者:Leah 栏目:编程语言

Golang中怎么利用Slice对append进行扩容,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

// grow grows the slice s so that it can hold extra more values, allocating // more capacity if needed. It also returns the old and new slice lengths. func grow(s Value, extra int) (Value, int, int) {     i0 := s.Len()     i1 := i0 + extra     if i1 < i0 {         panic("reflect.Append: slice overflow")     }     m := s.Cap()     if i1 <= m {         return s.Slice(0, i1), i0, i1     }     if m == 0 {         m = extra     } else {         for m < i1 {             if i0 < 1024 {                 m += m             } else {                 m += m / 4             }         }     }     t := MakeSlice(s.Type(), i1, m)     Copy(t, s)     return t, i0, i1 } // Append appends the values x to a slice s and returns the resulting slice. // As in Go, each x's value must be assignable to the slice's element type. func Append(s Value, x ...Value) Value {     s.mustBe(Slice)     s, i0, i1 := grow(s, len(x))     for i, j := i0, 0; i < i1; i, j = i+1, j+1 {         s.Index(i).Set(x[j])     }     return s }

首先 Append 判断类型是否 slice,然后调用 grow 扩容,从 l1 <= m 的判断可以发现确实容量足够的情况下,只是对原始数组建立一个新的 slice

但当容量不足时,可以看到只有在当前元素 i0 小于1024时,才是按2倍速度正常,否则其实每次只增长25%,代码验证如下:

func main() {     str := make([]int, 1023)     fmt.Println(len(str), cap(str))     str = append(str, 1)     fmt.Println(len(str), cap(str))     str = append(str, 1)     fmt.Println(len(str), cap(str)) } 输出: 1023 1023 1024 2048 1025 2048

初始容量已经达到1024后,只增长了256

func main() {     str := make([]int, 1024)     fmt.Println(len(str), cap(str))     str = append(str, 1)     fmt.Println(len(str), cap(str))     str = append(str, 1)     fmt.Println(len(str), cap(str)) } 输出: 1024 1024 1025 1280 1026 1280

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI