golang 击破slice中append陷阱

目录

陷阱小程序

问题击破

参考文章

后记


陷阱小程序

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

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: 0xc00001c038
*******************s2 end**********************

根据输出可以看出main函数中s1和s2除了address(切片地址)以外,其他的信息都是一样的,但是注意到s1 start中和s2 start打印两个切片中元素信息时,两

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值