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
相关产品推荐
相关产品推荐

