本文共 2105 字,大约阅读时间需要 7 分钟。
函数在Go语言中是第一类类型,既可以作为其他函数的参数或返回值,也可以直接被调用。以下是函数的基本组成部分:
func声明 keyword、函数名、参数列表、返回列表和函数体组成。()包裹,返回值可省略。{}包裹,且{必须位于同行行尾。例如:
func A() { // 无输入参数,无返回值,默认返回0 // 函数体}func B(a, b int) int { // 多个相同类型参数可用简写模式 return a + b}func C(a, b int) (sum int) { // 有名返回值 sum = a + b return} Go语言的函数特点:
示例:
// 1. 可有无输入参数和返回值func D(a, b int) (sum int) { sum := a + b return}// 2. 多个相同类型参数可用简写模式func E(a, b, c int) (max int) { return max(a, b, c)}// 3. 支持嵌套匿名函数func F(a, b int) (int, int) { return b, a} 不定参数在Go语言中用于处理可变长度的参数列表,需满足以下条件:
示例:
// 1. 不定参数类型相同func sum(arr ...int) (sum int) { for _, v := range arr { sum += v } return}// 2. 不定参数可以是切片func suma(arr ...int) int { for v := range arr { sum += v } return} 函数类型(Function Signature)是去除函数名和参数名后的函数定义行。可以用type定义函数类型变量:
示例:
func add(a, b int) int { return a + b }func sub(x int, y int) int { return x - y }type Op func(int, int) intfunc do(f Op, a, b int) int { return f(a, b)} 匿名函数可直接赋值给变量或作为返回值使用:
var sum = func(a, b int) int { return a + b } func getAdd() func(int, int) int { return func(a, b int) int { return a + b }} func main() { defer func() { // 使用 defer 注册延迟函数 if err := recover(); err != nil { fmt.Println(err) } }() // ...} Go语言提供两种错误处理机制:
示例:
func main() { defer func() { if err := recover(); err != nil { fmt.Println(err) } }() // ... panic("错误信息")} 错误接口error可用于函数返回值:
type error interface { Error() string}func openFile(filename string) (file *os.File, error) { file, err := os.Open(filename) if err != nil { return nil, err } return file, nil} Go语言的函数机制基于以下原理:
如需进一步了解底层实现,可参考Go语言的官方文档。
转载地址:http://onuwk.baihongyu.com/