go slice 的append的用法细节

tomleoken · · 1129 次点击 · 开始浏览    置顶

**append的时候,如果slice容量足够,不需要扩容,则slice底层数组的值会变动。如果需要扩容,会形成新的数组指针给到slice,原来的数组值是不会变的。对于想要在函数调用过程中改变上层传入的slice里的值的写法要注意!!!** #### **容量足够** ``` func main() { line := "123456789abcdefghijklmnopqrstuvw" // len 32 l := []byte(line) // 默认cap 32 aaa(l[27:30]) logger.Infof("out : %v %v", len(l), cap(l)) logger.Infof("l %v", string(l)) } func aaa(line []byte) { logger.Infof("in 1: %v %v", len(line), cap(line)) logger.Infof("in line: %v", string(line)) line = append(line, []byte("AAA")...) logger.Infof("in 2: %v %v", len(line), cap(line)) logger.Infof("in line2: %v", string(line)) } ``` 输出 ``` 2022-08-31 15:38:58 file=TestThings/main.go:111 level=info in 1: 3 5 2022-08-31 15:38:58 file=TestThings/main.go:112 level=info in line: stu 2022-08-31 15:38:58 file=TestThings/main.go:114 level=info in 2: 5 5 2022-08-31 15:38:58 file=TestThings/main.go:115 level=info in line2: stuAA 2022-08-31 15:38:58 file=TestThings/main.go:100 level=info out : 32 32 2022-08-31 15:38:58 file=TestThings/main.go:101 level=info l 123456789abcdefghijklmnopqrstuAA ``` #### **容量不够** ``` func main() { line := "123456789abcdefghijklmnopqrstuvw" // len 32 l := []byte(line) // 默认cap 32 aaa(l[27:30]) logger.Infof("out : %v %v", len(l), cap(l)) logger.Infof("l %v", string(l)) } func aaa(line []byte) { logger.Infof("in 1: %v %v", len(line), cap(line)) logger.Infof("in line: %v", string(line)) line = append(line, []byte("AAA")...) logger.Infof("in 2: %v %v", len(line), cap(line)) logger.Infof("in line2: %v", string(line)) } ``` 输出 ``` 2022-08-31 16:00:35 file=TestThings/main.go:105 level=info in 1: 3 5 2022-08-31 16:00:35 file=TestThings/main.go:106 level=info in line: stu 2022-08-31 16:00:35 file=TestThings/main.go:108 level=info in 2: 6 16 2022-08-31 16:00:35 file=TestThings/main.go:109 level=info in line2: stuAAA 2022-08-31 16:00:35 file=TestThings/main.go:100 level=info out : 32 32 2022-08-31 16:00:35 file=TestThings/main.go:101 level=info l 123456789abcdefghijklmnopqrstuvw ```

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

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

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