文章目录
  1. 1. 函数
    1. 1.1. 普通函数的定义
    2. 1.2. 多值返回函数
    3. 1.3. 成员方法
    4. 1.4. 延迟代码(defer)
    5. 1.5. 变参
    6. 1.6. 函数作为值
    7. 1.7. 回调

函数

普通函数的定义

func 函数名(参数) (返回值)

1
2
3
func do(a int, b float64) bool{
...
}

多值返回函数

1
2
3
4
5
6
func do(a , b int) (v1 int,v2 bool){
...
v1 = 2
v2 = true
return
}

成员方法

1
2
3
4
5
6
7
8
9
type A struct{
...
}
func (a *A)SetValue(v int) bool{
...
}
func (a A)GetCount(v int) bool{
...
}

延迟代码(defer)

示例

1
2
3
4
5
6
func ReadWrite() bool {
file.Open("file")
defer file.Close() //file.colse加入defer列表(先进后出的队列),在return前执行

return ture //defer列表的代码自动执行后return
}

defer修改返回参数
示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
defer func() {     //没有函数名 匿名函数
/* ... */
}() // () 在这里是必须的

defer func()(a int) {
/* ... */
}(10) //给返回参数赋值10

func f() (ret i n t ) { //ret 初始化为零
defer func() {
ret++ //ret 增加为1
}()
return 0 //返回的是1 而不是0
}

变参

*不定量的int参数8

1
2
3
4
5
func myfunc(arg ... int ) { 
for i,j:=range arg{
...
}
}

如果不指定变参的类型,默认是空的接口interface{},所有类型都实现了空接口,所以可以接收任意类型

变参传递给另一个变参函数
func myfunc(arg … i n t ) {
myfunc2(arg…) //按原样传递
myfunc2(arg[:2]…) //传递部分
}

函数作为值

1
2
3
4
5
6
7
func main() {
a := func() { //定义一个匿名函数,并且赋值给a
println("Hello")
} //这里没有()
a() //调用函数
fmt.Printf("\%T\n", a) //打印a 的类型,输出结果是func()。
}

匿名函数作为map的值。

1
2
3
4
5
var xs = map[ int ]func() int {
1: func() int { return 10 },
2: func() int { return 20 },
3: func() int { return 30 },
}

回调

1
2
3
4
5
6
7
8
9
func printit(x int ) { 
fmt.Printf("%v\n", x)
}
func callback(y int , f func( int )) {
f(y)
}
func main(){
callback(10,printit)
}
文章目录
  1. 1. 函数
    1. 1.1. 普通函数的定义
    2. 1.2. 多值返回函数
    3. 1.3. 成员方法
    4. 1.4. 延迟代码(defer)
    5. 1.5. 变参
    6. 1.6. 函数作为值
    7. 1.7. 回调