CTO练习营 | 12月3-5日,深圳,是时刻成为优良的技巧治理者了
在 Golang 中函数之间传递变量时老是以值的方法传递的,无论是 int,string,bool,array 如许的内置类型(或者说袈洵始的类型),照样 slice,channel,map 如许的引用类型,在函数间传递变量时,都是以值的方法传递,也就是说传递的都是值的副本。
内置类型参数传递
内置类型传递的时刻是值的副本,这个好懂得,随便举个例子:
- package main
- import (
- "fmt"
- )
- func main() {
- num := 10
- num2 := increase(num, 10)
- fmt.Println(num2)
- }
- func increase(num int, add int) int {
- return num + add
- }
这里 num 传入 increase 函数,是拷贝值的副本,并且返回一个新的值。假设 num 是一个很大年夜的数组,那么传递给函数的就是这个很大年夜数组的拷贝。(如许很浪费内存,真实情况如不雅要传一个很大年夜的数组,应当传递数组的指针)
引用类型的参数传递也是值的拷贝。
引用类型的参数传递
例子:
- package main
- import (
- "fmt"
- )
- func main() {
- slice1 := []string{"zhang", "san"}
- modify(slice1)
- fmt.Println(slice1)
- }
- func modify(data []string) {
- data = nil
- }
运行结不雅:
[zhang san]
这个例子证清楚明了作为引用类型的切片,参数传递不是传的引用,而是传的值,如不雅是传的引用,那么函数对它的修改会受到影响,而这里切片内容并没有改变成 nil.
然则有一个例子比较误导人,我们看一看: