Go 使用具有多个返回值的方法

Go 使用具有多个返回值的方法,go,go-templates,Go,Go Templates,我正在尝试编写一个模板(使用html/template)并向其传递一个结构,该结构包含一些附加的方法,其中许多方法返回多个值。有没有办法从模板中访问这些内容?我希望能够做到以下几点: package main import ( "fmt" "os" "text/template" ) type Foo struct { Name string } func (f Foo) Baz() (int, int) { return 1

我正在尝试编写一个模板(使用html/template)并向其传递一个结构,该结构包含一些附加的方法,其中许多方法返回多个值。有没有办法从模板中访问这些内容?我希望能够做到以下几点:

package main

import (
        "fmt"
        "os"
        "text/template"
)

type Foo struct {
    Name string
}

func (f Foo) Baz() (int, int) {
    return 1, 5
}

const tmpl = `Name: {{.Name}}, Ints: {{$a, $b := .Baz}}{{$a}}, {{b}}`

func main() {

    f := Foo{"Foo"}

    t, err := template.New("test").Parse(tmpl)
    if err != nil {
        fmt.Println(err)
    }

    t.Execute(os.Stdout, f)

}
但很明显,这是行不通的。没有办法吗

我考虑过在代码中创建匿名结构:

data := struct {
    Foo
    a   int
    b   int
}{
    f,
    0,
    0,
}
data.a, data.b = f.Baz()
并将其传入,但更希望在模板中包含一些内容。有什么想法吗?我还尝试编写一个包装器函数,并将其添加到funcMaps中,但始终无法使其工作


谢谢你的建议

您将无法调用在模板中返回两个值的函数,除非其中一个值是错误的。这是为了保证您的模板在运行时工作。如果你感兴趣的话,有一个很好的答案可以解释这一点

要解决您的问题,您需要1)将函数分解为两个单独的getter函数,您可以在模板中的适当位置调用它们;或者2)让函数返回一个简单的结构,其中包含值

我不知道哪一个对您更有利,因为我真的不知道您的实现需要什么。福和巴兹没有给出多少线索

下面是选项一的一个quick-n-dirty示例:

type Foo struct {
    Name string
}

func (f Foo) GetA() (int) {
    return 1
}

func (f Foo) GetB() (int) {
    return 5
}
然后相应地修改模板:

const tmpl = `Name: {{.Name}}, Ints: {{.GetA}}, {{.GetB}}`

希望这能有所帮助。:)

还可以返回包含多个字段的struct并使用它们

type Result struct {
    First string
    Second string
}

func GetResult() Result {
     return Result{First: "first", Second: "second"}
}
然后在模板中使用

{{$result := GetResult}}
{{$result.First}} - {{$result.Second}}

我最近遇到了一个类似的问题,遇到了这个问题。我想这可能会干净一点。它不需要您创建多个新函数:

consttmpl=`Name:{{.Name},Ints:{{{BazWrapper.}`
func main(){
f:=Foo{“Foo”}
funcMap:=模板。funcMap{
“BazWrapper”:func(f Foo)字符串{
a、 b:=f.Baz()
返回fmt.Sprintf(“%d,%d”,a,b)
},
}
t、 err:=template.New(“test”).Funcs(funcMap.Parse(tmpl)
如果错误!=零{
fmt.Println(错误)
}
t、 执行(os.Stdout,f)
}

不能从模板调用函数,这是正确的。那么,您将继续使用
包装函数
?显示您当前的工作,并让他人帮助您完成。相关:。解决方案是一样的:您必须创建一个自定义函数。我尝试创建一个函数(FirstValue),该函数将另一个函数作为其参数,然后只返回原始输出的第一个值。不幸的是,我似乎无法在模板中传递该方法,因此它无法工作:{{FirstValue.Baz}}调用.Baz()}},而不是传递它,所以这是不可能的。非常感谢可能的重复。我想可能是这样的。我的解决方案包括通过迭代一组项目并使用它们进行一些(链接的)工作来进行一组计算。我试图避免多次迭代的开销,这将使所需的计算量增加一倍。不过,我喜欢将struct传递回的想法,这很有道理。谢谢