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

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

猜你喜欢

转载自www.cnblogs.com/node-js/p/8964908.html
今日推荐