声明
函数名、参数列表、返回值列表(可省略)、函数体
func name (parameter-list) (result_list) {
body
}
如函数包含返回值列表,则必须以return结尾,除非函数无法运行到结尾处,如panic异常或存在无限循环
多返回值
很多标准库的函数返回2个值,一个是返回值,一个是函数出错时的错误信息
links, err = findLinks(url)
links, _ = findLinks(url)
如果一个函数所有的返回值都有变量名,则return后可不加操作数,为bare return 但不宜过度使用,容易混淆
错误
通常导致失败的原因不只1种,因此额外的返回值不采用bool类型,而是error类型
内置的error是接口类型,可取nil(函数运行成功)或者non-nil(失败)
fmt.Println(%v, err)
//可输出错误信息
错误处理策略
- 传播错误:追溯包含原始错误信息
- 重新尝试失败:限制重试时间或次数
- 输出错误信息并结束程序:只在main中执行
- 输出错误信息,不中断程序执行:通过log.Printf或fmt.Printf输出错误信息
- 直接忽略错误:os.RemoveAll(dir)
文件结尾错误EOF
package io
import "errors"
var EOF = errors.New("EOF")
函数值
函数类型的零值是nil,调用值为nil的函数值会引起panic错误
函数值可以与nil比较,但函数之间不可相互比较,也不能将函数值作为map的panic
匿名函数
函数字面量的语法和函数声明相似,区别在于func关键字后有没有函数名
函数字面量是一种表达式,它的值被称为匿名函数,允许我们使用函数时再定义
可变函数
参数数量可变的函数称为可变参数函数,典型的例子就是fmt.Printf和类似函数,Printf首先接收一个必备的函数,之后接收任意个数的后续参数。
在声明可变参数函数时,需要在参数列表的最后一个参数类型之前加上省略符号“...”,表示该函数会接收任意数量的该类型参数。
可变参数函数经常被用于格式化字符串,函数名的后缀f是一种通用的命名规范,代表该可变参数函数可以接收Printf风格的格式化字符串。