登录
首页 >  Golang >  Go问答

文本/模板:“无法调用 0 结果的方法/函数。”

来源:Golang技术栈

时间:2023-03-26 18:43:07 375浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《文本/模板:“无法调用 0 结果的方法/函数。”》,这篇文章主要会讲到golang等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

如何在不返回值的模板中执行函数?这是示例:

func main() {
    u, err := url.Parse("http://example.com/test?param1=true&param2=true")
    if err != nil {
        log.Fatal(err)
    }
    m := u.Query()
    m.Del("param1") // param1 successful deleted!
    u.RawQuery = m.Encode()
    fmt.Println(u.RawQuery)

    const tmpl = `
    {{$m := .Query}}
    {{$m.Del "param2"}} 
    {{.RawQuery}}
    `
    t := template.Must(template.New("").Parse(tmpl))
    err = t.Execute(os.Stdout, u)
    if err != nil {
        log.Println("executing template:", err)
    }

}

在 play.golang.org 中查看此代码

我知道在模板中不应该有太多的逻辑,但是在我看来,对不返回值的运行函数的无知似乎是一个有趣的问题。

正确答案

Go 中的模板与其他语言(例如 PHP)中的模板不同。用于template.FuncMap为您的模板创建自定义函数。

package main

import (
    "fmt"
    "log"
    "net/url"
    "os"
    "text/template"
)

func main() {
    funcMap := template.FuncMap{
        "delete": deleteMap,
    }

    u, err := url.Parse("http://example.com/test?param1=true&param2=true")
    if err != nil {
        log.Fatal(err)
    }

    u = deleteMap(u, "param1") // works in regular code and templates

    fmt.Println(u.RawQuery)

    const tmpl = `
    {{$m := delete . "param2"}} 
    {{$m.RawQuery}}
    `
    t := template.New("").Funcs(funcMap)
    t = template.Must(t.Parse(tmpl))

    err = t.Execute(os.Stdout, u)

    if err != nil {
        log.Println("executing template:", err)
    }

}

func deleteMap(u *url.URL, key string) *url.URL {
    m := u.Query()
    m.Del(key) // key successful deleted!
    u.RawQuery = m.Encode()
    return u
}

或者,试试游乐场版本

好了,本文到此结束,带大家了解了《文本/模板:“无法调用 0 结果的方法/函数。”》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>