#《Go 语音圣经(中文版)》

#函数声明

函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体。

如果一个函数声明不包括返回值列表,那么函数体执行完毕后,不会返回任何值。

1
2
3
func name(parameter-list) (result-list) {
body
}

返回值也可以像形式参数一样被命名。在这种情况下,每个返回值被声明成一个局部变量,并根据该返回值的类型,将其初始化为该类型的零值。

1
2
3
4
5
6
7
8
9
func add(x int, y int) int   {return x + y}
func sub(x, y int) (z int) { z = x - y; return}
func first(x int, _ int) int { return x }
func zero(int, int) int { return 0 }

fmt.Printf("%T\n", add) // "func(int, int) int"
fmt.Printf("%T\n", sub) // "func(int, int) int"
fmt.Printf("%T\n", first) // "func(int, int) int"
fmt.Printf("%T\n", zero) // "func(int, int) int"

_可以强调某个参数未被使用。

如果一组形参或返回值有相同的类型,不必为每个形参都写出参数类型:

1
2
func f(i, j, k int, s, t string)                 { /* ... */ }
func f(i int, j int, k int, s string, t string) { /* ... */ }

**函数的类型被称为函数的签名。**如果两个函数形式参数列表和返回值列表中的变量类型一一对应,那么这两个函数被认为有相同的类型或签名。

形参和返回值的变量名不影响函数签名,也不影响它们是否可以以省略参数类型的形式表示。[1]

每一次函数调用都必须按照声明顺序为所有参数提供实参(参数值)。

在函数调用时,Go语言没有默认参数值,也没有任何方法可以通过参数名指定形参,因此形参和返回值的变量名对于函数调用者而言没有意义。

在函数体中,函数的形参作为局部变量,被初始化为调用者提供的值。函数的形参和有名返回值作为函数最外层的局部变量,被存储在相同的词法块中。

如果没有函数体的函数声明,这表示该函数不是以Go实现的。这样的声明定义了函数签名:

1
2
3
package math

func Sin(x float64) float // implemented in assembly language

  1. 后面这半句我没懂是什么意思? ↩︎