» Go语言快速入门 » 1. 基础篇 » 1.7 函数

函数

在 Go 中,使用 func 关键字定义函数。

func greet() {
    fmt.Println("Hello!")
}

Go 函数的特性使其在语言的简洁性、效率和可读性方面独具特色。

多返回值

Go 允许函数返回多个值。

func nums() (int, int) {
    return 5, 8
}

命名返回值

Go 允许在函数签名中为返回值命名。这对于标示每个返回值的目的并提高代码可读性比较有用。

func divideAndRemainder(dividend, divisor int) (quotient, remainder int) {
    quotient = dividend / divisor
    remainder = dividend % divisor
    return
}

由于返回值已经有了名称,你不需要在语句中显式地 return 它们。只需单独使用 return 关键字即可。

变参函数

Go 允许你使用省略号(...)语法创建接受可变数量参数的函数。当参数数量事先未知时,这非常有用。

package main

import "fmt"

func sum(numbers ...int) int {
    total := 0
    for _, num := range numbers {
        total += num
    }
    return total
}

func main() {
    result := sum(1, 2, 3, 4, 5)
    fmt.Println(result)
}

匿名函数

Go 支持匿名函数,可以形成闭包。它们是没有名字的函数,可以在行内定义并调用。闭包特别适用于封装功能和创建简洁的代码。

package main

import "fmt"

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

func main() {

    nextInt := makeIntFunc()

    fmt.Println(nextInt())
    fmt.Println(nextInt())
    fmt.Println(nextInt())

    newInts := makeIntFunc()
    fmt.Println(newInts())
}

递归

递归是函数直接或间接调用自身的过程。

package main

import "fmt"

func factorial(n int) int {
    if n <= 0 {
        return 1
    }
    return n * factorial(n-1)
}

func main() {
    // 计算 5 的阶乘
    result := factorial(5)
    fmt.Printf("Factorial of 5 is: %d\n", result)
    // => Factorial of 5 is: 120
}

方法

在 Go 中,方法是与特定类型关联的函数。它们类似于函数,但定义时有一个接收者,该接收者是与类型相关的参数。

package main

import "fmt"

type Circle struct {
    Radius float64
}

// 与 Circle 类型相关联的方法
func (c Circle) Area() float64 {
    return 3.14 * c.Radius * c.Radius
}

func main() {
    myCircle := Circle{Radius: 5.0}

    // 在 Circle 实例上调用方法
    area := myCircle.Area()

    fmt.Printf("Area of the circle: %.2f\n", area)
    // => Area of the circle: 78.50
}

一等公民

Go 将函数视为一等公民,这意味着你可以将它们作为参数传递给其他函数,从函数返回它们,并将它们赋值给变量。

package main

import "fmt"

func apply(operation func(int, int) int, a, b int) int {
    return operation(a, b)
}

func add(a, b int) int {
    return a + b
}

func main() {
    result := apply(add, 3, 4)
    fmt.Println(result)
}

函数排序

使用 sort.Slice 函数对数值切片进行排序。

package main

import (
	"fmt"
	"sort"
)

func main() {
	numbers := []int{5, 2, 9, 1, 5, 6}

	// 使用自定义排序函数对切片进行排序
	sort.Slice(numbers, func(i, j int) bool {
		return numbers[i] > numbers[j]
	})

	fmt.Println("Sorted slice:", numbers)
    // => Sorted slice: [9 6 5 5 2 1]
}

sort.Slice 的第二个参数是一个定义排序顺序的函数。在该示例中,它是一个简单的匿名函数,比较两个元素,如果索引 i 处的元素大于索引 j 处的元素,则返回 true

代码挑战

编写一个 Go 程序,定义一个名为 createCounter 的函数,该函数返回一个闭包。 该闭包是一个计数器,每次调用时都会增加计数值并返回计数。

Loading...
> 此处输出代码运行结果
上页
下页