Go语言入门-函数-function
定义
Go语言中函数面向过程编程中最小的模块单元,具备输入、输出的功能,完成从输入到输出的转换,主要是把业务逻辑或者算法分解成具备单一功能,独立解耦的程序块。
函数签名
函数的签名包括:关键字 “func”、函数名称、函数参数、函数返回值。
Go语言的函数定义格式:
//多个返回值,需要用括号包裹起来
func functionName([parameterList]) ([returnTypes]) {
...
body
...
}
//返回值只有一个可以省略返回值需要包裹的括号
func functionName([parameterList]) returnType {
...
body
...
}
- 关键字func用来标示函数的定义声明
- functionName-函数名:首字母不是能数字,同一个包里不能出现重复(即使参数返回值不同)
- parameterList-参数: 在定义时, 用来限定函数的输入的占位符,需要指定输入参数的类型,也可以指定参数的默认变量(形参),调用时可以直接传入变量(实际参数),参数是可选的
- returnTypes-返回值:在定义时,用来限定函数的输出,需要指定输出参数的类型,在调用时主要做右值,赋值给调用方输出结果,当函数没有返回值时可以不需要returnTypes
- body-函数块:用来处理代码逻辑块。
函数参数
-
参数类型简写
当两个或多个连续的函数命名参数是同一类型,则除了最后一个类型之外,其他都可以省略。 -
普通函数定义
//普通函数定义 a,b 形式参数
func testAdd(a int, b int) {
}
func main() {
var c, d int
//普通函数调用 c,d实际参数
testAdd(c, d)
}
a int, b int 为形式参数列表
var c, d int 为形式参数
- 参数类型简写
//省略a的类型
func testAdd(a, b int) {
}
//等价于
func testAdd(a int, b int) {
}
- 变长形参
当函数的输入不固定时,通过在最后一个参数名增加 [… + 参数类型] 来定义改函数可以接收不定长的参数。
//strs ...string 相当于是形式切片
func parseParams(strs ...string) {
fmt.Printf("strs Type %T\n", strs)
for i, str:= range strs {
fmt.Printf("param [%d] = [%s]\n", i, str)
}
fmt.Println("parseParams done")
}
func main() {
parseParams("a", "b", "c")
parseParams("a", "b", "c", "d")
parseParams("a", "b", "c", "d", "e")
}
/**
output:
strs Type []string
param [0] = [a]
param [1] = [b]
param [2] = [c]
parseParams done
strs Type []string
param [0] = [a]
param [1] = [b]
param [2] = [c]
param [3] = [d]
parseParams done
strs Type []string
param [0] = [a]
param [1] = [b]
param [2] = [c]
param [3] = [d]
param [4] = [e]
parseParams done
*/
strs Type []string 可以看出变长的参数实际上对应参数类型的切片
函数形参
是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数.形参可以当多函数局部变量。因此不能在函数中在定义同名变量。
func testFuncScope(a int) {
var a int //'a' redeclared in this block --编译报错
fmt.Println(a)
}
函数实参
是在使用函数使用实际要输入的参数,目的是把对应变量的值传递给形式参数。
//普通函数定义 a,b 形式参数
func testAdd(a int, b int) {
}
func main() {
var c, d int
//普通函数调用 c,d实际参数
testAdd(c, d)
}
以上示例中 a、b是形式参数,c、d是实际参数。当函数调用时c、d会传递给函数内部的实际形参变量中。
函数实际参数赋值给形式参数(函数局部变量)都是值传递。也就意味着要函数修改传入的实际参数变量的值,只能通过传递该参数变量的地址才能修改。当然传递进去的地址本质也是值拷贝。虽然引用类型看上去传引用,本质也是传递对应数据接口的指针。
函数返回值
函数返回值,当在函数定义时,定义了返回值的类型和变量,那么意味着在函数定义中不能出现同名变量。可以理解为定义的返回值变量也是局部变量。
单返回值
- 示例1
单个返回值,函数定义的时候没有指定函数返回值变量,那么在调用时直接返回a的副本给调用发。–值传递。
//验证函数返回值
//返回值没有指定1个返回值初始区部变量
func testReturn1() int {
var a int
return a
}
返回值变量,