这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
一、本堂课重点内容
本堂课的知识要点有哪些?
- Go语言函数的参数
二、详细知识点介绍
本堂课介绍了哪些知识点?
Go语言函数的参数
- 函数定义时的参数称为形式参数,简称「形参」。
- 而函数调用时传入的参数为实质参数,简称「实参」。形参只在函数体内使用,其作用域为从函数头的形参列表处延伸到函数体结束。如果函数体内又嵌入了匿名函数,则形参在匿名函数内仍然可见。
- 函数的参数列表可以包含0个到多个变量。参数必须是变量,不可以是常量及常量表达式,也不可以是变量表达式。
- 参数列表里只允许出现变量名及变量类型,多个变量之间用逗号分隔。所有参数最后必须用小括号括起来,0个参数也不能省略小括号。
- 函数的参数个数事实上是可变的,由于参数不定,因此最后一个参数后面需要用省略号...来表示,省略号后面是参数类型。这就意味着所有的可变参数都与最后一个参数同类型。
- 函数调用的过程实质就是用实参代替形参,执行函数体的过程。实参代替形参有两种方式:值传递和引用传递。
- 值传递就是用实参值的副本赋给形参,形参以该副本值参与各种表达式运算,运算结果有可能影响形参,即实参的副本,对实参原值却没有影响。
- 引用传递就是以实参的地址传递给形参,因此要求形参必须是地址类型的变量,或指针变量。形参获得了实参的地址,访问该地址就可以获得实参的值。如果形参所在表达式修改了形参(指针)指向的值,则相当于修改了实参的值。
- Go语言中默认基础数据类型,数组,字符串,结构体等都为值传递;切片,映射,通道,指针包括函数等为引用传递。Go语言中字符串尽管按值的方式传递,但是编译系统内部实际上还是按地址传递的,这点用户不用理会。
- 函数作参数会有两种传递方式:如果是直接调用函数,利用其运行结果作为函数的参数,则是值传递。
- 对于值传递要求函数的返回值的类型和数量要严格满足被调用函数的形参要求。
- 结构体与函数类似,可以是按值传递,也可以是按引用传递。如果结构体的字段较少,是可以采用值传递的;如果是字段比较多的大型结构体,建议设计一个指针指向结构体,使用指针作参数,从而间接引用结构体,形成引用传递。
- 所谓引用传递,就是函数的形参类型为地址,实参类型也必须为地址或者指针,这种地址传递就称为引用传递。
- 函数类型变量的传递方式包括值传递和引用传递,值传递是以函数调用后的返回值作为实参,前面已经举例。引用传递是将函数作为实参传递给形参,要求形参的类型为函数类型,且传入的实参也必须是同类型的函数。
- Go语言允许使用空接口
interface{}来表示任意类型。 - 任何函数的参数都可以使用空接口,尤其是可变参数,这为函数的使用提供了极大的方便。从此,函数调用者再也不必刻意改变或转换实参的类型了,任何类型的实参都可以直接传入函数,函数也能正确执行。