猿问

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

我正在尝试编写一个模板(使用 html/模板)并将其传递给一个结构,该结构附加了一些方法,其中许多方法返回多个值。有没有办法从模板中访问这些?我希望能够执行以下操作:


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 中,但根本无法让它工作。


感谢您的任何建议!


largeQ
浏览 155回答 3
3回答

MYYA

您将无法调用在模板中返回两个值的函数,除非这些值之一是错误。这是为了保证您的模板在运行时工作。如果您有兴趣,这里有一个很好的答案可以解释这一点。要解决您的问题,您需要 1) 将您的函数分解为两个单独的 getter 函数,您可以在模板中的适当位置调用它们;或 2) 让您的函数返回一个包含内部值的简单结构。我不知道哪个对你更好,因为我真的不知道你的实现需要什么。Foo 和 Baz 没有给出很多线索。;)这是选项一的快速示例: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}}`希望这会有所帮助。:)

慕田峪7331174

还可以返回具有多个字段的结构并使用它们。type Result struct {    First string    Second string}func GetResult() Result {     return Result{First: "first", Second: "second"}}然后在模板中使用{{$result := GetResult}}{{$result.First}} - {{$result.Second}}
随时随地看视频慕课网APP

相关分类

Go
我要回答