面试题答案
一键面试代码实现
package main
import "fmt"
func filterAndSquare(originalSlice []int) []int {
filter := func(num int) bool {
return num%2 == 0
}
square := func(num int) int {
return num * num
}
var result []int
for _, num := range originalSlice {
if filter(num) {
result = append(result, square(num))
}
}
return result
}
你可以使用以下方式调用这个函数:
func main() {
originalSlice := []int{1, 2, 3, 4, 5, 6}
result := filterAndSquare(originalSlice)
fmt.Println(result)
}
闭包设计思路
- 过滤器闭包:定义了一个闭包
filter
,它接收一个整数num
作为参数,并返回一个布尔值。在闭包内部,通过判断num
对2取模的结果是否为0,来决定该数是否为偶数。这个闭包将筛选逻辑封装起来,使得代码的逻辑更加清晰,易于维护和复用。 - 平方闭包:定义了另一个闭包
square
,它接收一个整数num
作为参数,并返回num
的平方。同样,这个闭包将平方操作封装起来,增强了代码的模块化。
函数式编程方式相较于传统循环方式的优势
- 代码可读性和可维护性:
- 函数式编程将复杂的操作分解为多个简单的函数(闭包),每个函数只负责单一的职责,如筛选偶数和平方操作。这样代码结构更加清晰,易于理解和维护。
- 传统循环方式可能会将筛选和操作的逻辑混合在一个循环体中,随着逻辑的复杂,代码可读性会降低。
- 复用性:
- 闭包函数可以在不同的场景中复用。例如,
filter
闭包可以用于其他需要筛选偶数的地方,square
闭包可以用于任何需要对整数进行平方的操作。 - 传统循环方式通常是针对特定需求编写的,复用性较差。
- 闭包函数可以在不同的场景中复用。例如,
- 代码简洁性:
- 函数式编程通过组合多个小的函数来实现复杂功能,代码更加简洁。虽然在这个简单示例中体现可能不明显,但在处理更复杂的数据转换和操作时,优势会更加突出。
- 传统循环方式可能需要更多的变量声明和控制语句,代码会相对冗长。