关于golang 如何创建链式操作的问题

dewei
  • 129

请教一下,python面向对象可以看通过 call 与 getattr 来动态的通过实例化 来进行链式操作,如 obj.a.b.c.d() ,所以我想问一下 golang如何实现这一功能.谢谢.

回复
阅读 2.5k
3 个回答
package main

import "fmt"

type cli struct {
}

func NewCli() *cli {
    return &cli{}

}
func (ths *cli) Where() *cli {
    fmt.Println("where")
    return ths
}

func (ths *cli) Join() *cli {
    fmt.Println("join")
    return ths
}

func (ths *cli) Find() string {
    //fmt.Println("Find")
    return "find"
}

func main()  {
    findData := NewCli().Where().Join().Find()
    fmt.Print(findData)
}

输出:

where
join
find

这个不是语言的问题,所谓的链式调用,实质上就是一个方法返回了一个对象,该对象还有其他方法而已可以继续调用而已,如楼上所示

以上都不是我想要的答案, 我拿python举例 通过__getattr__函数可以获取到 对象后边的属性 比如 obj.a.b.c.d 但其实这些属性并没有提前定义在obj中. 当比如执行 obj.a.b.c.d.e() 的时候 会去触发 call ,等于是一个动态的生成了一个链路,并且可以获取到这个链路,并执行call函数. 所以我想知道 golang有没有这种功能. 第一个答案依然是需要人工创建才行

宣传栏