You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go模板中如何将函数作为参数传入另一个函数?

Go模板中传递自定义函数作为参数的解决方案

问题原因

Go模板的语法机制会将直接书写的函数名视为立即执行的调用,而非函数值本身。你尝试调用{{ listOperate . toCamel}}时,模板会先执行toCamel(),但该函数需要1个参数,因此触发参数数量不匹配的错误。

可行解决方案

方案1:通过包装函数返回目标函数

定义一个无参的包装函数,返回toCamel的函数值,这样在模板中调用包装函数就能得到可传递的函数对象。

代码修改

在自定义函数映射中添加包装函数:

"listOperate": func(lst []string, fn func(string) string) (result []string) {
    result = make([]string, len(lst))
    for i, item := range lst {
        result[i] = fn(item)
    }
    return result
},
"toCamel": func(str string) string {
    return strcase.ToCamel(str)
},
// 添加包装函数,返回toCamel函数本身
"getToCamelFunc": func() func(string) string {
    return strcase.ToCamel
},

模板调用

{{ listOperate . (getToCamelFunc) }}

这里getToCamelFunc()会返回toCamel的函数值,作为参数传递给listOperate,就能正常执行列表转换逻辑。

方案2:修改listOperate接收函数名而非函数值

调整listOperate的设计,让它接收函数名称字符串,内部通过模板的函数映射(FuncMap)获取并执行目标函数。

代码修改

更新listOperate的定义(需确保能访问到模板的FuncMap):

"listOperate": func(lst []string, funcName string, funcMap template.FuncMap) ([]string, error) {
    // 从FuncMap中获取目标函数并断言类型
    fn, ok := funcMap[funcName].(func(string) string)
    if !ok {
        return nil, fmt.Errorf("invalid function: %s", funcName)
    }
    result := make([]string, len(lst))
    for i, item := range lst {
        result[i] = fn(item)
    }
    return result, nil
},
"toCamel": func(str string) string {
    return strcase.ToCamel(str)
},

模板调用

需要将FuncMap传入模板上下文(比如通过数据对象传递),然后调用:

{{ listOperate . "toCamel" .FuncMap }}

关键说明

Go模板本身不支持直接传递函数值作为参数,必须通过上述间接方式实现函数的传递与调用。两种方案中,方案1的侵入性更低,更适合大多数场景。

内容的提问来源于stack exchange,提问作者Taoist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:43:14