MST

星途 面试题库

面试题:Go函数的可变参数与闭包

1. 解释Go语言中可变参数函数的定义和使用场景,编写一个函数计算任意多个整数的平均值。2. 什么是闭包,在Go语言中如何实现闭包,举例说明闭包在实际场景中的应用。
35.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

1. Go语言中可变参数函数

定义

在Go语言中,可变参数函数是指函数的参数数量是可变的。定义可变参数函数时,在参数类型前加上 ...,表示该参数可以接受任意数量的值。例如:

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

这里 nums 就是一个可变参数,它本质是一个切片,函数内部可以像操作切片一样操作它。

使用场景

  • 灵活性需求:当函数需要处理不确定数量的参数时,可变参数函数提供了极大的灵活性。比如在日志记录函数中,可能需要记录不同数量的信息片段。
  • 简化函数调用:避免为不同参数数量重载多个相似的函数。例如计算不同数量整数的和,不需要为2个整数、3个整数、4个整数等分别定义函数。

计算任意多个整数的平均值

package main

import "fmt"

func average(nums ...int) float64 {
    sum := 0
    for _, num := range nums {
        sum += num
    }
    if len(nums) == 0 {
        return 0
    }
    return float64(sum) / float64(len(nums))
}

2. 闭包

定义

闭包是一个函数值,它可以引用其函数体外部的变量。闭包使得这些变量的生命周期延长,只要闭包函数还能被调用,这些变量就不会被释放。

在Go语言中实现闭包

在Go语言中,通过在一个函数内部定义另一个函数,并在内部函数中引用外部函数的变量来实现闭包。例如:

package main

import "fmt"

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

这里 counter 函数返回一个匿名函数,这个匿名函数引用了 counter 函数内部的变量 i,形成了闭包。每次调用返回的匿名函数,i 都会自增并返回新的值。

实际场景中的应用

  • 实现计数器:如上述 counter 函数的例子,在需要记录某个操作发生次数的场景中非常有用。
  • 缓存数据:可以实现一个函数,它内部维护一个缓存,后续调用时先检查缓存中是否有结果,避免重复计算。例如:
func memoize(f func(int) int) func(int) int {
    cache := make(map[int]int)
    return func(x int) int {
        if val, ok := cache[x]; ok {
            return val
        }
        result := f(x)
        cache[x] = result
        return result
    }
}

这里 memoize 函数接受一个函数 f,返回一个新的闭包函数。这个闭包函数会缓存 f 的计算结果,提高性能。