大神解释下关于copy函数的问题

wujiangwei · 2019-01-11 21:54:55 · 1111 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2019-01-11 21:54:55 的主题,其中的信息可能已经有所发展或是发生改变。

我们知道go语言只有一种传值方式,那就是值传递,当然还可以通过值传递来传递指针,那么问题来了

package main

import (
    "fmt"
)

func swap(a,b *int){
    *a,*b = *b,*a
}

func modifyArr( arr *[3]int) {
    arr[1] = 12
}

func main(){
    a,b := 3,4
    swap(&a,&b)
    fmt.Println(a,b)

    arr := [3]int{1,2,3}
    modifyArr(&arr)
    fmt.Println(arr)

    s1 := arr[:]
    fmt.Println("org:s1:",s1)
    s2 := []int{6,8}
    fmt.Println("org:s2:",s2)
    copy(s2,s1)
    fmt.Println("copied:s1:",s1)
    fmt.Println("copied:s2:",s2)

}

打印结果

4 3
[1 12 3]
org:s1: [1 12 3]
org:s2: [6 8]
copied:s1: [1 12 3]
copied:s2: [1 12]

代码中,a/b/arr 都是因为传递了 带 & 符号的指针才改变了他们原有的值 我们并没有给copy 函数的参数加上地址符号&,我们也没有接收 copy 函数的返回值 重新赋值给谁 按照传值理论, 为什么s2 就变了?


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

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

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