[golang]切片函数传递,在函数中使用append,在调用用输出未见改动,具体见图

slumzzw · · 2783 次点击
```C func demo(ce* []student) { (*ce)[1].age = 999 *ce = append(*ce, student{4, "xiaowan2g", 98}) *ce = append(*ce, student{5, "xiaowan3g", 88}) fmt.Printf("\t%p\n", *ce) fmt.Println("\t",len(*ce), cap(*ce)) fmt.Println("\t",ce) } ``` demo(&ce) 或者 ```C func demo(ce []student) []student { ce[1].age = 999 ce = append(ce, student{4, "xiaowan2g", 98}) fmt.Printf("%p\n", ce) fmt.Println(len(ce), cap(ce)) fmt.Println(ce) return ce } ``` ce = demo(ce) 从slice的设计就可以看出够烂是个烂语言, slice本身是个隐含的二级指针, 表面上看值传递只是单向拷贝,但是实际上却可以在子程序中修改外部的值 ,但是在子程序如果append扩容了,主程序中又得不到预期的结果 最终让代码和码农都陷入混乱之中 拍黄片宣传简单,那是真的简单,写起来行云流水,想到哪写到哪,代码运行结果99%符合预期 够烂宣传简单,那是假的简单,写起来磕磕绊绊,码农以为代码写对了,但是够烂总是在不起眼的地方冒出来绊你一下
#1
更多评论
我知道return或者demo(&ce),原段代码append主程序无效果的核心原因是什么?隐含的二级指针?这个有相关的资料么
#2
effective go 里面说了,底层数据是指针,slice本身是值传递。 We must return the slice afterwards because, although Append can modify the elements of slice, the slice itself (the run-time data structure holding the pointer, length, and capacity) is passed by value.
#3