值传递:
形参是实参的拷贝,改变形参的值并不会影响外部实参的值,是将实参的值拷贝到另外的内存地址中才修改。从被调用函数的角度来说,值传递是单向的(实参->形参)
函数内部定义的就是形参,主函数内的是实参
packagemain
import"fmt"
funcmodify1(xint){
x=100
}
funcmain(){
a:=int(20)
modify(a)
fmt.Println(a)
}
此时就是值传递
调用函数就是值传递,修改a并不会使原来a的值发生变化 引用传递:
形参相当于是实参的 “ 别名 ” ,引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量,而指针可以改变其指向的对象)
packagemain
import"fmt"
funcmodify2(x*int){
*x=100
}
funcmain(){
a:=int(20)
modify(&a)
fmt.Println(a)
}
此时a的递增的值已经被modify1修改为100 引用类型指针,map,slice,chan
在Go语言中对于引用类型的变量,我们在使用的时候不仅 要声明它,还要为它分配内存空间(初始化),否则我们的值就没办法存储
使用new或者make函数进行初始化
new初始化指针 make初始化map,slice和chan
map,slice和chan可以用定义的方法初始化
例如:
var mapist map[string]int
maplist = map[string]int {"one":1} 闭包 闭包:引用了外部变量的匿名函数(闭包让你可以在一个内层函数中访问到其外层函数的作用域)
函数 + 引用环境 = 闭包
例
1. // 准备一个字符串
2. str := "hello world"
3. // 创建一个匿名函数
4. foo := func() {
5. // 匿名函数中访问str
6. str = "hello dude"
7. }
8. // 调用匿名函数
9. foo()
第6行:匿名函数中没有定义str,第6行引用str就形成了闭包 捕获:闭包中对自由变量的引用叫做捕获