我正在使用GTK bindings for Go进行一些实验性工作。
与大多数GUI框架一样,GTK GUI应用程序通常会生成一个主窗口,应用程序的工作在该窗口的上下文中完成。
当您使用C ++编写GTK GUI应用程序时,您将继承框架窗口类 - gtk.Window
- 并将您应用程序的其他GUI组件声明为您继承的窗口类的公共成员(或使用公共访问方法)在你的窗口类)。这样它们就可以被窗口控制器类操纵。它通过名称作为窗口类的成员来处理它们。您只需将指向主窗口的指针传递到控制器类并通过编写mWindow.MyWidget.text="text"
等来操纵其成员。再次,AFAIK,大多数GUI应用程序的设计都类似,无论使用何种GUI框架。
但是,由于Go不支持继承,因此无法使用此选项:当您在Go-Gtk窗口中实例化其他GUI组件时,它们是自立变量,而不是父窗口类的成员 - 它们不是t"生活"在容器类中。这意味着您的GUI控制器类必须单独访问主窗口中的每个组件,没有内聚结构或单引用引用。这会影响可读性和良好的代码组织,IMO - 迫使您的代码结构有点糟糕。
我相信Go中这个问题的解决方案是声明一个struct / interface,它将作为所有主窗口GUI组件的容器。该接口将发布组件的访问方法,并可以传递给GUI控制器单元以操纵其成员。
我需要知道是否存在针对此类任务的标准惯用Go设计模式,或者使用Go来解决此问题的正确方法。
我知道Go
旨在成为一种系统编程语言,并不是真正考虑到前端开发而设计的,但我听说它会说#34;每一个好的系统语言都会结束用于应用程序",并且今天没有比Go
更好的系统语言 - 证据是GUI框架和其他应用程序任务的许多Go绑定正在浮出水面。只需A list of Go projects.
我想从这一切中得到的结论是Go并不是为了让开发桌面GUI应用程序变得容易,而这些应用程序是一种濒临死亡的品种 。< / em>的
答案 0 :(得分:2)
如果我必须在Go中编写带有GUI的应用程序,我会完全将GUI部分与应用程序部分分离。这种方法的一个例子是GTK Server。
只是,您不需要单独的流程来处理GUI:您可以在goroutine中执行此操作,使用通道与应用程序的其余部分进行通信,与Gtk Server使用套接字/管道/的方式相同消息队列。
我不知道有谁使用过这种方法,而且我自己只在玩具程序中使用它来构建一个简单的Tk GUI(使用Tk因为有一个内置的解释器并且不知道但是gtk-server)。但这对我来说是在Go中构建GUI应用程序的惯用方法。
答案 1 :(得分:1)
您正在询问如何将一组内容组合到一个集合中,以便控制器可以访问所有这些内容。您注意到在C ++中,可以使此集合成为gtk.Window的子类。在go中,没有类或类型层次结构,但解决方案类似。
解决方案就是定义一个结构。也许是这样的:
type MainWindow struct {
Win *gtk.Window
RedButton *gtk.Widget
GreenButton *gtk.Widget
}
窗口的控制器可以访问任何字段,无需其他方法或访问器:
type MainController struct {
W *MainWindow
other fields...
}
func (mc *MainController) DoSomething() {
mc.W.RedButton.MakeVisible(true)
mc.W.GreenButton.MakeVisible(false)
}
这里的方法显然只是为了说明。