值传递和引用传递
-
-
在Go语言中五个引用类型变量,其他都是值类型
-
slice
-
map
-
channel
-
interface
-
func()
-
-
引用类型作为参数时,称为浅拷贝,形参改变,实参数跟随变化.因为传递的是地址,形参和实参都指向同一块地址
-
值类型作为参数时,称为深拷贝,形参改变,实参不变,因为传递的是值的副本,形参会新开辟一块空间,与实参指向不同
-
代码演示
-
值类型作为参数代码演示
package main import "fmt" func demo(i int, s string) { i = 5 s = "改变" } func main() { i := 1 s := "原值" demo(i, s) fmt.Println(i, s) //输出:5 原值 }
- 引用传递代码示例
package main import "fmt" func demo(arg []int) { arg[len(arg)-1] = 110 } func main() { s := []int{1, 2, 3} demo(s) fmt.Println(s) //输出:[1 2 110] }
- 如果希望值类型实参跟随形参变化,可以把值类型指针作为参数
package main import "fmt" //行参指针类型 func demo(i *int, s string) { //需要在变量前面带有*表示指针变量 *i = 5 s = "改变" } func main() { i := 1 s := "原值" //注意此处第一个参数是i的地址,前面& //s保留为值类型 demo(&i, s) fmt.Println(i, s) //输出:5 原值 }