返回

云原生系列Go语言篇 - 函数,函数伴我闯江湖

后端

函数,函数伴我闯江湖

学到现在,我们的程序都局限于 main 函数中的寥寥数行。是时候搞点更大的动作了。本章中我们会学习如何在 Go 语言中编写函数以及函数那些有趣的东西。

1. 函数的定义

函数是 Go 语言中代码复用的基本单位。函数可以被定义在包级别或局部作用域内。包级别的函数可以在包的任何地方被调用,而局部作用域内的函数只能在定义它们的函数或块内被调用。

函数的定义由函数名、参数列表和函数体组成。函数名是用来标识函数的唯一名称,参数列表是函数接收的参数,函数体是函数要执行的代码块。

func greet(name string) {
    fmt.Println("Hello", name)
}

上面的代码定义了一个名为 greet 的函数,它接收一个字符串参数 name,并在函数体中打印出 "Hello" 和 name 的值。

2. 函数的调用

函数可以通过函数名后面跟着参数列表来调用。参数列表中的参数必须与函数定义中的参数一一对应。

greet("John")

上面的代码调用了 greet 函数,并传入了一个字符串参数 "John"。

3. 函数的类型

函数的类型由其参数类型和返回值类型组成。函数的类型可以被用作变量的类型。

var f func(string)

上面的代码声明了一个变量 f,它的类型是一个函数类型,该函数接收一个字符串参数并返回 void。

4. 函数式编程

函数式编程是一种编程范式,它强调函数的使用和避免状态的变化。函数式编程语言通常支持高阶函数、闭包和惰性求值。

5. 高阶函数

高阶函数是指可以接收函数作为参数或返回值的函数。高阶函数可以使代码更具通用性和可重用性。

func map(f func(int) int, xs []int) []int {
    ys := make([]int, len(xs))
    for i, x := range xs {
        ys[i] = f(x)
    }
    return ys
}

上面的代码定义了一个名为 map 的高阶函数,它接收一个函数 f 和一个切片 xs 作为参数,并返回一个新的切片 ys。新的切片 ys 是通过将函数 f 应用于切片 xs 中的每个元素而得到的。

6. 闭包

闭包是指可以访问其定义作用域中变量的函数。闭包可以使代码更具模块性和可重用性。

func makeCounter() func() int {
    i := 0
    return func() int {
        i++
        return i
    }
}

上面的代码定义了一个名为 makeCounter 的函数,它返回一个闭包。闭包返回一个函数,该函数每次被调用时都会将 i 的值递增 1 并返回 i 的值。

7. 函数指针

函数指针是指指向函数的指针。函数指针可以使代码更具通用性和可重用性。

var f func(int) int
f = func(x int) int { return x * x }

上面的代码声明了一个变量 f,它的类型是一个函数指针。函数指针 f 被赋值为一个匿名函数,该函数接收一个整数参数并返回该整数的平方。

8. 接口

接口是指定义了一组方法的类型。接口可以使代码更具通用性和可重用性。

type Shape interface {
    Area() float64
    Perimeter() float64
}

上面的代码定义了一个名为 Shape 的接口,它定义了两个方法 Area 和 Perimeter。任何实现这些方法的类型都是 Shape 接口的类型。

9. 面向对象编程

面向对象编程是一种编程范式,它强调对象和类的使用。面向对象编程语言通常支持封装、继承和多态性。

10. 总结

函数是 Go 语言中代码复用的基本单位。函数可以被定义在包级别或局部作用域内。函数可以通过函数名后面跟着参数列表来调用。函数的类型由其参数类型和返回值类型组成。函数式编程是一种编程范式,它强调函数的使用和避免状态的变化。高阶函数是指可以接收函数作为参数或返回值的函数。闭包是指可以访问其定义作用域中变量的函数。函数指针是指指向函数的指针。接口是指定义了一组方法的类型。面向对象编程是一种编程范式,它强调对象和类的使用。