duanjiu2701
duanjiu2701
2018-07-31 18:39

Go中是否有类似于C ++绑定的内容?

已采纳

I'm trying to do something in Go, similar to C++'s bind.
In C++ :

class A {
public:
    typedef std::function<bool(const string&)> Handler;
    bool func(A::Handler& handler) {
        // getData will get data from file at path
        auto data = getData(path);
        return handler(data);
    }
};

In another class B:

Class B {
public:
    bool run() {
        using namespace std::placeholders;
        A::Handler handler = bind(&B::read, this, _1);
        m_A.initialize();
        return m_A.func(handler);
    }
    bool read(const string& data) {
        std::out << data << std::endl;
    }
private:
    A m_A {};
};

when B's run() function is called, it will bind class B member function read with A's Handler. Then m_A.func(hander) is called, it will call getData(). The data got is then parsed to B::read(const string& data)

Is there any way to do it in Go? How to create a forwarding call wrapper in golang?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

  • douguio0185 douguio0185 3年前

    Solution:

    I'm posting my own solution for my question:

    I am passing go function as a parameter of another function to do the callback. The following code is a go version of the above C++ code.

    In A.go

    type A struct {
        //... some properties
    }
    
    type Handler func(string) bool
    func (a *A) ReadRecords(handler Handler) bool {
        // getData will get data from file at path
        auto data = getData(path)
        return handler(data)
    }
    
    func (a *A) Initialize() {
        //... Initialization
    }
    

    In B.go, A is a member of B struct

    type B struct {
        a    A
        //...other properties
    }
    
    var read A.Handler
    func (b *B) Run() bool {
        read = func(data string) {
            fmt.Println(data)
        }
        b.a.Initialize()
        return b.a.ReadRecords(read)
    }
    
    点赞 评论 复制链接分享