MST

星途 面试题库

面试题:Go函数的可变参数与闭包结合应用

编写一个Go函数,该函数接受可变参数,同时在函数内部使用闭包,实现对传入参数的累加操作,并返回累加结果的闭包函数,解释这样设计的好处和可能存在的问题。
28.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import "fmt"

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

好处

  1. 代码简洁:通过闭包,将状态(sum)和操作(累加)封装在一起,使得代码结构更紧凑,逻辑更清晰。
  2. 数据持久化:闭包可以访问和修改外部函数的变量(sum),实现数据的持久化。每次调用返回的闭包函数,sum 的值都会基于上一次调用的结果进行累加,不需要在外部维护一个全局变量来记录累加状态。

可能存在的问题

  1. 内存泄漏:如果闭包函数一直被持有,外部函数的变量(sum)也不会被垃圾回收机制回收,可能会导致内存泄漏。例如,如果将闭包函数存储在一个全局变量中,并且持续调用,sum 占用的内存会不断增加,除非手动重置 sum
  2. 线程安全问题:如果在多线程环境下使用这个闭包函数,由于 sum 是共享的,可能会出现竞态条件。例如,多个线程同时调用闭包函数进行累加操作,可能导致 sum 的值计算错误,需要使用诸如互斥锁(sync.Mutex)等机制来保证线程安全。