在很多编程语言中都有函数,GO语言也不例外。下面是一个经典例子:
package main
import "fmt"
func add(a int, b int) int {
return a + b
}
func add2(a, b int) int {
return a + b
}
func exists(m map[string]string, k string) (v string, ok bool) {
v, ok = m[k]
return v, ok
}
func main() {
res := add(1, 2)
fmt.Println(res) // 3
v, ok := exists(map[string]string{"a": "A"}, "a")
fmt.Println(v, ok) // A True
}
一.函数的定义:
- 使用
func关键字来定义函数。 - 函数名紧跟在
func关键字后面。 - 函数可以接受参数,并且可以返回一个或多个值。
二.函数的参数和返回值:
1.参数
- 可以在函数名后的括号中指定一个或多个参数。每个参数由参数名、类型组成,用逗号分隔。
- 可以在函数括号后面指定返回值的类型,如果没有返回值,可以省略返回值列表。
func add(x int, y int) int {
return x + y
}
2. 多个返回值:
- 函数可以返回一个或多个值。
- 返回值的类型可以在函数定义时进行指定。
- 使用逗号分隔返回值列表。
func divide(x, y float64) (float64, error) {
if y == 0 {
return 0, errors.New("division by zero")
}
return x / y, nil
}
3. 命名返回值:
- 可以在函数定义时为返回值指定名称。
- 命名返回值就像定义了一个具有该名称的变量。
- 不需要显式使用
return语句返回命名返回值,函数结束时会自动返回。
func divide(x, y float64) (result float64, err error) {
if y == 0 {
err = errors.New("division by zero")
return
}
result = x / y
return
}
三. 可变参数函数:
- 可以使用
...声明可变参数列表。 - 在函数体内,可变参数被当作切片来处理。
func sum(numbers ...int) int {
total := 0
for _, num := range numbers {
total += num
}
return total
}
注意 在GO语言中,函数的变量是后置的
四. 匿名函数:
- 可以在函数内部定义匿名函数。
- 匿名函数可以作为值传递给其他函数或存储在变量中。
```go
func main() {
greeting := func() {
fmt.Println("Hello, world!")
}
greeting()
}
```
五. 闭包:
- 闭包是一个函数值,它可以引用其外部作用域中的变量。
- 闭包使得我们可以在函数内部继续访问和修改外部函数的变量。
func increment() func() int {
count := 0
return func() int {
count++
return count
}
}
func main() {
counter := increment()
fmt.Println(counter()) // 输出 1
fmt.Println(counter()) // 输出 2
}