面试题答案
一键面试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
的计算结果,提高性能。