初级会员
  • 第 54588 位会员
  • 18328048335
  • 2020-07-04 08:31:18
  • 269
  • Offline
  • 19 89

最近发布的主题

    暂无

最近发布的文章

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • goland 断点插满,逐行执行
  • #4 @tablecell 认真的吗。。。
  • 评论了主题 go语言报错求解
    m.GetS().SetV(40)没有返回值,只是一个执行过程,所以打印了个寂寞
  • 你这个写法。。。 首先你声明了一个变量backtracing77,它的类型是func (int, []int) 然后你又给backtracing77赋值,复制的对象又是匿名函数func (int,[]int)[]int 这个函数的执行结果,即类型[]int。 类型不匹配,报错信息里面应该提示了的,以后注意研究研究报错信息。
  • 我的推断: --- --- golang中的参数传递都是拷贝传递,即使你传的参数是一个引用,它也会把这个引用给拷贝了,但是,它们两个都指向同一个地址,所以你做的修改并不是针对某个引用变量,而是某个引用变量所指向的对象。但是slice不是真正的引用类型,是大概长这样的一个结构体: ``` type slice struct { array unsafe.Pointer len int cap int } ``` 传参拷贝后的确是复制了这样的一个结构体,但是内部的array指针也复制了,所以指向的是同一底层数组的首地址。 想必楼主已经知道了append函数的原理了,就不多言了。 这个修改。。。如果你addNum这么写: ``` sli[0] = 999 ``` 那么arr[0]当然也会变成999。 然后,append确实没有重新分配底层数组,完整的底层数组确实是[0 0 0 4]没错,但是你忘了,arr被声明的时候,还记得slice的数据结构吗?有个len属性,arr的len是3啊,它读不到第四个元素上。append的是sli这个arr的值拷贝对象,尽管它们都共用一个底层数组的起始地址,但是len可不一样, 所以arr只有底层数组的前面三个值[0 0 0],sli则是[0 0 0 4], %p直打slice打的确实是底层数组地址,如果要打切片本身的地址,要这样:`("%p\n", &arr)`. 我推理的不知是否正确。