golang 击破slice中append陷阱

本文通过一个陷阱小程序分析了Go语言中slice在使用append时可能出现的问题。讲解了slice的地址、长度、容量变化,以及扩容策略。指出在函数中对传入的slice进行append操作可能会影响原slice,而在容量足够的情况下,只会影响函数内部的slice副本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

陷阱小程序

问题击破

参考文章

后记


陷阱小程序

(例子引用自golang随笔之slice+append的陷阱_cheems~的博客-优快云博客

package main
import "fmt"
func main(){
    s1 := []int{1,2}
    s2 := s1
    s2 = append(s2,3)
    Test1(s1)
    Test2(s2)
    fmt.Println(s1,s2)
}
func Test1(s []int){
    s = append(s,0)
    for i:= range s{
        s[i]++    
    }
}
// 选项
A:[2,3] [2,3,4]
B:[1,2] [1,2,3]
C:[1,2] [2,3,4]
D:[2,3,1] [2,3,4,1]

大家可以先做一下,看下自己的答案是不是跟正确答案不一样。

 

问题击破

先来公布一下陷阱程序的答案:C

 

下面来对答案进行一个剖析

从陷阱程序main函数开始:

1、首先,我们来看一下s1和s2的一些信息,如example1.1。

// 程序分解 example 1.1
package main
​
import (
"fmt"
)
​
func main() {
    s1 := []int{1, 2}
    s2 := s1 
​
    // s1信息
    fmt.Printf("s1: %v, len: %d, cap: %d, address: %p\n", s1, len(s1), cap(s1), &s1)
    // s2信息
    fmt.Printf("s2: %v, len: %d, cap: %d, address: %p\n", s2, len(s2), cap(s2), &s2) 
 
​
    // s1中元素信息
    fmt.Println("*******************s1 start**********************")
    for i := range s1 {
        fmt.Printf("ele: %v, address: %p\n", s1[i], &s1[i])
    }
    fmt.Println("*******************s1 end**********************")
                        
    // s2中元素信息
    fmt.Println("*******************s2 start**********************")
    for j := range s2 {
        fmt.Printf("ele: %v, address: %p\n", s2[j], &s2[j])
    }
    fmt.Println("*******************s2 end**********************")
}
// 输出:
s1: [1 2], len: 2, cap: 2, address: 0xc000010030
s2: [1 2], len: 2, cap: 2, address: 0xc000010048
​
*******************s1 start**********************
ele: 1, address: 0xc00001c030
ele: 2, address: 0xc00001c038
*******************s1 end**********************
​
*******************s2 start**********************
ele: 1, address: 0xc00001c030
ele: 2, address: 0xc00001
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值