Skip to content

函数

参考资料:

1、声明

函数的声明格式如下:

go
func 函数名([参数列表]) [返回值] {
  函数体
}

声明函数有两种办法,一种是通过 func 关键字直接声明,另一种就是通过 var 关键字来声明:

go
func sum(a int, b int) int {
  return a + b
}

var sum = func(a int, b int) int {
  return a + b
}

Go 中的函数不支持重载。

2、参数

Go 中的参数名可以不带名称,一般这种是在接口或函数类型声明时才会用到,不过为了可读性一般还是建议尽量给参数加上名称:

go
type ExWriter func(io.Writer) error

type Writer interface {
  ExWrite([]byte) (int, error)
}

对于类型相同的参数而言,可以只需要声明一次类型,不过条件是它们必须相邻:

go
func Log(format string, a1, a2 any) {
  ...
}

变长参数可以接收 0 个或多个值,必须声明在参数列表的末尾,最典型的例子就是 fmt.Printf 函数:

go
func Printf(format string, a ...any) (n int, err error) {
  return Fprintf(os.Stdout, format, a...)
}

Go 中的函数参数是传值传递,即在传递参数时会拷贝实参的值。

3、返回值

Go 允许函数有多个返回值,此时就需要用括号将返回值围起来:

go
func Div(a, b float64) (float64, error) {
  if a == 0 {
    return math.NaN(), errors.New("0不能作为被除数")
  }
  return a / b, nil
}

Go 也支持具名返回值,不能与参数名重复,使用具名返回值时,return关键字可以不需要指定返回哪些值:

go
func Sum(a, b int) (ans int) {
  ans = a + b
  return
}

不管具名返回值如何声明,永远都是以return关键字后的值为最高优先级:

go
func SumAndMul(a, b int) (c, d int) {
  c = a + b
  d = a * b
    // c,d将不会被返回
  return a + b, a * b
}