go中数组为值传递的验证及指针的简单使用
1. 数组默认为值传递
package main
import "fmt"
func main() {
arr := [3]int{}
fmt.Println(arr)
//
replace(arr)
fmt.Println(arr)
//
replaceByPointer(&arr)
fmt.Println(arr)
}
// 数组默认为值传递(与java不同),所以此函数中对数组的改变不会影响原数组
func replace(arr [3]int) {
for i := 0; i < len(arr); i++ {
arr[i] = i
}
}
// 借助指针实现数组的引用传递, 函数中对数组的改变就是对原数组的改变
func replaceByPointer(arr *[3]int) {
len := len(*arr)
for i := 0; i < len; i++ {
(*arr)[i] = i
}
}
控制台打印:
[0 0 0]
[0 0 0]
[0 1 2]
2. 切片默认为引用传递
package main
import "fmt"
// 切片默认为引用传递
func main() {
slice := make([]int, 3)
fmt.Println(slice)
//
replaceSlice(slice)
fmt.Println(slice)
}
// 切片默认为引用传递
func replaceSlice(arr []int) {
for i := 0; i < len(arr); i++ {
arr[i] = i
}
}
控制台打印:
[0 0 0]
[0 1 2]
其他收获:
-
函数
func replace(arr [3]int){}
, 参数类型为数组,并且长度必须为3函数
func replaceSlice(arr []int) {}
, 参数类型为切片 -
切片的两种初始化方式:
slice := make([]int, 3)
slice := []int{0,0,0}
-
可以使用&获取变量的内存地址验证数组默认为值传递, 如下,第一个和第三个内存地址相同,第二个为值传递所以不同
-
上述代码中遍历数组/切片,将索引作为值的代码可以简化成如下代码:
func replaceSlice(arr []int) { for i := range arr { arr[i] = i } }