切片函数传递,在函数中使用append,在调用用输出未见改动,具体见代码和运行图:
```go
package main
import "fmt"
type student struct {
id int
name string
age int
}
func demo(ce []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)
}
func main() {
var ce []student
ce = []student{
student{1, "xiaoming", 22},
student{2, "xiaozhang", 33},
}
ce = append(ce, student{3, "xiaowang", 56})
fmt.Printf("%p\n", ce)
fmt.Println(len(ce), cap(ce))
demo(ce)
fmt.Println(len(ce), cap(ce))
fmt.Println(ce)
}
```
运行截图:
![【golang】切片函数传递,在函数中使用append,在调用用输出未见改动,具体见图](https://cdn.learnku.com/uploads/images/202107/06/67616/ZUBFmNU6jd.png!large)
ce 的地址是一样的,预计结果应该都是输出 [{1 xiaoming 22} {2 xiaozhang 999} {3 xiaowang 56} {4 xiaowan2g 98}],未能如愿,不知道问题出在哪里?求教!
更多评论
```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