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
}
*/
为什么在函数传参时,数组参数有无固定长度,会产生这样的差距,就是arr5里面的内容不会被改变,arr7却会改变,刚开始学go,求大佬赐教
codeYuanY · 2020-10-07 20:27:50 · 1157 次点击> 当函数内部发生slice发生减少的时候,则不会导致底层数组改变,会影响外部作用域的底层数组
只有发生扩容
才会创建新的底层数组,在Golang里面这个扩容
过程有两个不同的逻辑,主要的区别是有没有赋值回原变量
,详细可以看这篇文章:Go语言设计与实现 - 3.2.4 追加和扩容
附骚操作:
// 深拷贝的第二种方式 - 触发值赋值
a := []int{1,2,3}
b := append(a[:0:0], a...)
> 没有找到Slice的定义
Golang没有显性告诉开发者Slice的结构,若是开发者有需求,这可以通过reflect.SliceHeader
查看或直接修改
a := []int{1, 2, 3}
b := (*reflect.SliceHeader)(unsafe.Pointer(&a))
更多评论
这是一个关于array与slice的问题
这两个看起来长得差不多,刚开始的确挺容易弄混淆的
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,代码可以变得高亮
上面预览的格式有点错乱,重新发布一下总结
明确指定大小即固定长度的为array
动态改变大小即不固定长度的为slice
在函数传递中,array是值传递,slice是地址传递
明确这个就应该很容易理解啦
arr5 是 array --- 值传递 --- 不改变
arr7 是 slice --- 地址传递 --- 改变
传递一个小技巧
在写代码的三个点后面加上golang,代码可以变得高亮