go语言值传递与地址传递的区别
值传递
这种方式使用变量、常量、数组元素作为函数参数,实际是将实参的值复制到形参相应的存储单元中,即形参和实参分别占用不同的存储单元,这种传递方式称为“参数的值传递”或者“函数的传值调用”。
值传递的特点是单向传递,即主调函数调用时给形参分配存储单元,把实参的值传递给形参,在调用结束后,形参的存储单元被释放,而形参值的任何变化都不会影响到实参的值,实参的存储单元仍保留并维持数值不变。
package main
import "fmt"
func Swap1 (x,y int) {
x,y = y,x
fmt.Println("x=",x,"y=",y)
}
func main() {
a , b := 10,20
fmt.Println("a=",a,"b=",b)
Swap1(a,b)
fmt.Println("a=",a,"b=",b)
}
运行结果:
地址传递
这种方式使用数组名或者指针作为函数参数,传递的是该数组的首地址或指针的值,而形参接收到的是地址,即指向实参的存储单元,形参和实参占用相同的存储单元,这种传递方式称为“参数的地址传递”。
地址传递的特点是形参并不存在存储空间,编译系统不为形参数组分配内存。数组名或指针就是一组连续空间的首地址。因此在数组名或指针作函数参数时所进行的传送只是地址传送,形参在取得该首地址之后,与实参共同拥有一段内存空间,形参的变化也就是实参的变化。
package main
import "fmt"
func Swap (x,y *int) {
*x,*y = *y,*x
fmt.Println("x=",*x,"y=",*y)
}
func main() {
a , b := 10,20
fmt.Println("a=",a,"b=",b)
Swap(&a,&b)
fmt.Println("a=",a,"b=",b)
}
运行结果:
golang切片和数组的区别
区别
- 定义方式不一样
- 初始化方法不一样
- 数组是值拷贝而切片是引用
定义不一样
- 数组定义
var a1 [3]int
var a2 [...]int{1,2,3}
- 切片定义
var b1 []int
b2 := make([]int, 3, 5)
初始化不同
- 数组
a1 := [...]int{1,2,3}
a2 := [5]int{1,2,3}
- 切片
b1 := make([]int, 3,5)// 长度3,容量5,(提前开辟内存空间,append添加数据不超容量时,切片地址不会变)。 容量可以省略不写
fmt.Println("数组***********************************")
var arr1 [3]int = [3]int{1, 2, 3}
var arr2 [3]int = arr1
fmt.Println(arr1, arr2)
arr2[0] = 10002
fmt.Println(arr1, arr2)
fmt.Println("切片***********************************")
var slice1 []int = []int{1, 2, 3}
var slice2 []int = slice1
fmt.Println(slice1, slice2)
slice2[0] = 10002
fmt.Println(slice1, slice2)
数组是值拷贝而切片是引用
D:/program/GoLang/hello golang/src/b/b.exe [D:/program/GoLang/hello golang/src/b]
数组***********************************
[1 2 3] [1 2 3]
[1 2 3] [10002 2 3]
切片***********************************
[1 2 3] [1 2 3]
[10002 2 3] [10002 2 3]
成功: 进程退出代码 0.