goland实现函数式链式编程
- 先来看一段代码
package main
import (
"fmt"
elastic "gopkg.in/olivere/elastic.v2"
)
type Tweet struct {
User string
Message string
}
func main() {
client, err := elastic.NewClient(elastic.SetSniff(false), elastic.SetURL("http://127.0.0.1:9200/"))
if err != nil {
fmt.Println("connect es error", err)
return
}
fmt.Println("conn es succ")
tweet := Tweet{User: "olivere", Message: "Take Five"}
//给Elasticsearch插入数据用到了函数链式编程
_, err = client.Index().
Index("twitter").
Type("tweet").
Id("1").
BodyJson(tweet).
Do()
if err != nil {
// Handle error
panic(err)
return
}
fmt.Println("insert succ")
}
- 可以看到,上面操作Elasticsearch中用到函数链式编程,在其他语言中也是支持的,那么它是如何实现的呢?
_, err = client.Index().
Index("twitter").
Type("tweet").
Id("1").
BodyJson(tweet).
Do()
- 其实实现起来还是蛮简单的,原理就是:方法调用返回值是方法调用对象本身。
- 下面是实现代码:
package main
import "fmt"
type Stu struct {
Name string
Age int
}
func (p *Stu) SetName(name string) *Stu {
p.Name = name
return p
}
func (p *Stu) SetAge(age int) *Stu {
p.Age = age
return p
}
func (p *Stu) Print() {
fmt.Printf("age:%d name:%s\n", p.Age, p.Name)
}
func main() {
stu := &Stu{}
stu.SetAge(12).SetName("stu01").Print()
}
学会了吗?是不是很容易呢?