arr5 := [5]int{1,2,3,4,5}
arr6 := baseStruct.Modify1(arr5)
fmt.Println(arr5)//打印结果:[1 2 3 4 5]
fmt.Println(arr6)//打印结果:[300 2 3 4 5]
/*
所用函数
func Modify1(array [5]int) [5]int{
array[0] = 300
return array
}
*/
arr7 := []int{1,2,3,4,5}
arr8 := baseStruct.Modify2(arr7)
fmt.Println(arr7)//打印结果:[300 2 3 4 5]
fmt.Println(arr8)//打印结果:[300 2 3 4 5]
/*
所用函数
func Modify2(array []int) []int {
array[0] = 300
return array
}
*/
`再次感谢@avtion的解惑` 个人平常关注底层理论还是太少、太浅 (厚脸皮不承认自己水平不够)
鉴于楼上的解答,知道了golang的slice的魔幻操作
所以我对这个问题进行了一下拓展,思考除slice外的map,struct,[]struct,[]map的修改,会有什么不同?
#### 先上结论:
```golang
array ---------- 传值 ---- 新的 赋值即可
slice ---------- 传址(append 后切断联系) ---- 新的 使用copy函数
map ---------- 传址 ---- 新的 for循环深度复制
struct ---------- 传值 ---- 新的 赋值即可
[]struct ---------- 传址 ---- 新的 使用copy函数
[]map ---------- 传址 ---- 新的 使用copy函数后还需要对map做for循环深度复制
```
鉴于我的测试代码实在太多,发布在这里排版可能不太好看,所以需要去github看
**github地址**: https://github.com/GrayMi/goNote/tree/master/0001-go%E8%AF%AD%E8%A8%80%E5%A4%8D%E6%9D%82%E7%B1%BB%E5%9E%8B%E7%9A%84%E4%BC%A0%E5%80%BC%E4%B8%8E%E4%BC%A0%E5%9D%80
如有发现错误或有歧义的地方,请帮忙指出,谢谢!
#7
更多评论
#### 这是一个关于array与slice的问题
这两个看起来长得差不多,刚开始的确挺容易弄混淆的
```golang
package main
import (
"fmt"
)
// 数组array-值传递
func Modify1(array [5]int) [5]int {
array[0] = 300
return array
}
// slice-地址传递
func Modify2(array []int) []int {
array[0] = 300
return array
}
func main() {
// 数组-需要明确指定大小
arr5 := [5]int{1, 2, 3, 4, 5}
arr6 := Modify1(arr5)
fmt.Println("arr5:", arr5) // 打印结果:[1 2 3 4 5]
fmt.Println("arr6:", arr6) // 打印结果:[300 2 3 4 5]
// slice-不需要明确指定大小
arr7 := []int{1, 2, 3, 4, 5}
arr8 := Modify2(arr7)
fmt.Println("arr7:", arr7) // 打印结果:[300 2 3 4 5]
fmt.Println("arr8:", arr8) // 打印结果:[300 2 3 4 5]
/*
// 数组-大小不可以变化
// 此处报错: ./main.go:32:16: first argument to append must be slice; have [5]int
arr9 := append(arr5, 6)
fmt.Println("arr9:", arr9) // 此处报错
*/
// slice-大小可以变化
arr10 := append(arr7, 6)
fmt.Println("arr10:", arr10) // 打印结果:[300 2 3 4 5 6]
}
```
<br/>
明确指定大小即固定长度的为**array** <br/>
动态改变大小即不固定长度的为**slice** <br/>
在函数传递中,array是**值传递**,slice是**地址传递** <br/>
<br/>
明确这个就应该很容易理解啦 <br/>
arr5 是 array --- 值传递 --- 不改变<br/>
arr7 是 slice --- 地址传递 --- 改变<br/>
<br/>
#### 传递一个小技巧
在写代码的三个点后面加上golang,代码可以变得高亮
#1
上面预览的格式有点错乱,重新发布一下总结
```
明确指定大小即固定长度的为array
动态改变大小即不固定长度的为slice
在函数传递中,array是值传递,slice是地址传递
明确这个就应该很容易理解啦
arr5 是 array --- 值传递 --- 不改变
arr7 是 slice --- 地址传递 --- 改变
```
#### 传递一个小技巧
在写代码的三个点后面加上golang,代码可以变得高亮
#2