前言
对于任何语言而言,函数都是结构化编程中的重要一环,通过函数机制,可以把一个大的模块分解成多个小任务,让代码结构更清晰,可复用性大大提高。
本文将介绍如何定义,调用函数,如何定义和接收函数错误,以及 golang 特有的可变参数,闭包,defer,panic 和 recover 等机制。
函数定义
Golang 的函数基本组成为:函数名,入参列表,函数体,返回参数列表。
func function_name( [parameter list] ) [return_types] {
// 函数体
}
// 如:
// func find_max(num1, num2 int) int {}
// func swap(x, y string) (string, string) {}
如果一个函数所有的返回值都有显式的变量名,那么该函数的return语句可以省略操作数。这称之为 bare return,但是不建议使用这种方法,会导致程序的可读性变差。
func CountWordsAndImages(url string) (words, images int, err error) {
// 函数体
return // 等价于 return words, images, err
}
words, images, err := CountWordsAndImages("/test/test.go")
//...
注意:
- 每一次函数调用都必须按照声明顺序为所有参数提供实参(参数值)。在函数调用时,Golang 没有默认参数值,也没有任何方法可以通过参数名指定形参。
- 默认情况下,Golang 使用的是值传递,因此函数的形参是实参的拷贝, 在调用过程中对形参进行修改不会影响实参。 如果需要在函数中修改变量,需要传入变量的指针。
- 跟 Golang 的变量命名规则一致,如果函数名的首字母为大写,函数为可导出函数,可以在包外被调用,如果为小写,则只能在本包内调用。
- Golang 的函数可以有多个返回值,调用时需要依次接收,如果有某个回参不需要被使用,必须要在对应位置使用 blank identifier
_
接收。 - 函数作为 Golang 中的 first class values,拥有类型,并且可以被赋值给其他变量,本身也可以作为函数的入参和回参。
可变参数
参数数量可变的函数称为为可变参数函数。例如 fmt.Printf()
函数,首先接收一个必备的参数,之后接收任意个数的后续参数。
func Printf(format string, a ...interface{
}) (n int, err error) {
return Fprintf(os.Stdout, format, a...)
}
在声明可变参数函数时,只能把可变参数作为参数列表的最后一个参数,在参数类型之前加上省略符号 ...
,这表示该函数会接收任意数量的该类型参数。如:
func sum(vals...int) int {
total := 0
for _, val := range vals {
total += val
}
return total
}
fmt.Println