指针 | 青训营笔记

116 阅读2分钟

值传递:

形参是实参的拷贝,改变形参的值并不会影响外部实参的值,是将实参的值拷贝到另外的内存地址中才修改。从被调用函数的角度来说,值传递是单向的(实参->形参)

函数内部定义的就是形参,主函数内的是实参

 

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就形成了闭包 捕获:闭包中对自由变量的引用叫做捕获