函数
普通函数
package main
import "fmt"
// 单返回值
func sum(a int, b int) int {
return a + b
}
// 多返回值
func test2() (string, int) {
name := "张三"
age := 11
return name, age
}
// 命名多返回值
// 命名多返回值不用声明变量 var name := "张三"
func test3() (name string, age int) {
name = "张三"
age = 11
return name, age
}
func main() {
//s := sum(1, 2)
//fmt.Println(s)
n, a := test2()
fmt.Println(n, a)
}
函数类型
package main
import "fmt"
func sum(a int, b int) int {
return a + b
}
func max(a int, b int) int {
if a > b {
return a
} else {
return b
}
}
func main() {
type f1 func(int, int) int
// 函数类型为f1
var ff f1 = sum
r := ff(1, 2)
fmt.Println(r)
ff = max
r = ff(1, 2)
fmt.Println(r)
}
类型定义和类型别名
package main
import "fmt"
func main() {
// 类型定义 创建一个新类型
//type MyInt int
//var i MyInt = 100
//fmt.Printf("%T,%v", i, i) // main.MyInt,100
// 类型别名 类型不变
type MyInt = int
var i MyInt = 100
fmt.Printf("%T,%v", i, i) // int,100
}
高阶函数
函数作为参数
package main
import "fmt"
func say(name string) {
fmt.Println(name)
}
func f1(name string, f func(string)) {
f(name)
}
func main() {
f1("hello world", say)
}
返回值为函数
package main
import "fmt"
func add(a int, b int) int {
return a + b
}
func sub(a int, b int) int {
return a - b
}
func cal(operator string) func(int, int) int {
switch operator {
case "+":
return add
case "-":
return sub
default:
return nil
}
}
func main() {
ff := cal("+")
r := ff(1, 3)
fmt.Println(r)
}
匿名函数
package main
import "fmt"
func main() {
// 匿名执行函数
r := func(a int, b int) int {
if a < b {
return b
} else {
return a
}
}(1, 2)
fmt.Println(r)
//匿名函数
max := func(a int, b int) int {
if a < b {
return b
} else {
return a
}
}
r2 := max(1, 4)
fmt.Println(r2)
}
闭包
基础
func main() {
f1 := add()
r := f1(10)
fmt.Println(r)
r2 := f1(20)
fmt.Println(r2)
fmt.Println("---------")
// 重新创建一个函数,闭包就被清空,值不会被保存
f2 := add()
r5 := f2(10)
fmt.Println(r5)
}
进阶
package main
import "fmt"
func cal(base int) (func(int) int, func(int) int) {
add := func(a int) int {
base += a
return base
}
sub := func(a int) int {
base -= a
return base
}
return add, sub
}
func main() {
add, sub := cal(1)
r := add(9)
fmt.Println(r) // 10
// 因为没有重新调用cal函数,所以执行减函数时,是复用加后的值
r2 := sub(2)
fmt.Println(r2) // 8
}
可变参数列表
func sumArgs(values …int)
- 可传入多个值
- 值的类型为
...
后面的类型
package main
import (
"fmt"
)
func sumArgs(values ...int) {
for i := range values {
fmt.Println(i)
}
}
func main() {
sumArgs(1, 2, 3)
}