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()
}

学会了吗?是不是很容易呢?

posted @ 2018-04-27 22:26  zhaocongliang  阅读(347)  评论(0编辑  收藏  举报