为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
largeQ 2021-10-18 17:16:32
我正在尝试编写一个模板(使用 html/模板)并将其传递给一个结构,该结构附加了一些方法,其中许多方法返回多个值。有没有办法从模板中访问这些?我希望能够执行以下操作:package mainimport (        "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 中,但根本无法让它工作。感谢您的任何建议!
查看完整描述

3 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

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


要解决您的问题,您需要 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}}`

希望这会有所帮助。:)


查看完整回答
反对 回复 2021-10-18
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

还可以返回具有多个字段的结构并使用它们。


type Result struct {

    First string

    Second string

}


func GetResult() Result {

     return Result{First: "first", Second: "second"}

}

然后在模板中使用


{{$result := GetResult}}

{{$result.First}} - {{$result.Second}}


查看完整回答
反对 回复 2021-10-18
  • 3 回答
  • 0 关注
  • 154 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信