Go语言圣经函数篇 | 青训营

54 阅读2分钟

声明

函数名、参数列表、返回值列表(可省略)、函数体

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) 
//可输出错误信息

错误处理策略

  1. 传播错误:追溯包含原始错误信息
  2. 重新尝试失败:限制重试时间或次数
  3. 输出错误信息并结束程序:只在main中执行
  4. 输出错误信息,不中断程序执行:通过log.Printf或fmt.Printf输出错误信息
  5. 直接忽略错误: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风格的格式化字符串。