如何在Go中使用子包正确构造一个包,而在大多数方法中,单个类型将成为子包?

我刚刚开始使用Go,所以如果我错过了明显的事情,请轻松:-)

无论如何,我目前正处于编写实用程序库的设计阶段,该实用程序库将使与x-go-binding的交互更加容易。(例如,我之前使用Python和xpyb进行过此操作。)例如,它将有助于查询EWMH规范中定义的信息以及将键绑定到回调函数。(还有更多。)因此,作为我对包装布局的最初想法,请考虑:

  • 实用程序

    • ew

    • 钥匙扣

每个地方都有自己的包裹。(类似于如何设置标准库的图像包。)

我的情况的独特之处在于,几乎每个x-go-binding调用都需要xgb连接对象或根窗口标识符的某种组合。因此,对我来说,将信息存储在这样的结构中很有意义:

type XUtilConnection struct {

    conn xgb.Conn

    root xgb.Id

    // a few other things, like a mapping of events to callbacks

}

这样我就有了一个可以像这样使用的工厂:


xconn = xutil.NewXUtilConnection(blah blah)

它可以像这样使用:


xconn.get_active_window()

xconn.bind_key("Shift-a", my_callback_fun)

也可能有类似的功能:


keybind.get_keycode("a")

ewmh.get_atom("_NET_ACTIVE_WINDOW")

我的问题当然是,据我所知,接收者只能是在同一包中声明的类型。如果我分开我的程序包,则不能在任何子程序包中将XUtilConnection类型用作接收方。


我怀疑我的答案是将这个大程序包分成不同的逻辑文件,但是我担心这可能导致名称空间混乱。(例如,实现EWMH规范可能大约需要100多个功能。)


我也知道我可以在每个子包中为XUtilConnection对象定义一个新的容器类型。(我听说这应该是一个包含单个成员XUtilConnection的结构,以避免进行强制转换。)但是在我看来,这似乎是一个非常混乱的情况,并且会阻止我想要的那种语义。(即,使用XUtilConnection结构调用几个不同模块中的方法。)


在设计过程中任何地方的任何建议,将不胜感激。谢谢!


幕布斯6054654
浏览 296回答 2
2回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go