Go语⾔开发Windows应⽤
当第⼀次看到Go程序在windows平台⽣成可执⾏的exe⽂件,就宣告了windows应⽤也⼀定是Go语⾔的战场。Go不是脚本语⾔,但却有着脚本语⾔的轻便简单的特性。相较于php和python之类以服务器控制台为主要战场的脚本语⾔来说,Go语⾔是真正的圆了“动态语⾔的应⽤开发梦”。
Windows Api
Windows桌⾯应⽤依赖于win api,画出各种应⽤界⾯和控件本质上就是调⽤windows提供的api。Go开发Windows App要做的第⼀件事情就是封装这些windows api。
这个项⽬已经实现了对winapi的封装。⽐如你会在中到CreateWindowEx的封装:
这⾥是使⽤了syscall包。这⾥要说明⼀下,golang的官⽅⽂档没有对syscall.Syscall12的说明,需要查看代码,这⾥的Syscall12代表了createWindowEx传⼊的参数有12个,已经实现的Syscall⽅法还有
Syscall, Syscall6, Syscall9, Syscall12, Syscall15。
控件
下⼀步,有基本的winapi之后,需要的是各个控件的使⽤接⼝。官⽅并没有提供标准库,但是有许多开源项⽬已经完成了这个封装,下⾯就是⼏个开源项⽬:
这⾥推荐和使⽤的是lxn的walk项⽬(Windows Application Library Kit),walk封装的控件应该是这⼏个⾥⾯最全的了,并且也在不断的完善中。
⽐如bitmap, radiobutton, checkbox, pushbutton等。在walk/example中能看到⼏个例⼦提供参考
实现
好了,有了go-winapi和walk两个开源项⽬,就可以开始做⼀个windows app了
界⾯如下:
这个是⼀个简易的socket im, 在⼀台机⼦上开启两个端⼝,8000和8001,两个端⼝相互监听和发送消息。
go版本的socket im 源码:
实现总是简单的,说⼏个代码⽚段:
1 创建窗⼝:
1 walk.Initialize(walk.InitParams{PanicOnError: true})
2 defer walk.Shutdown()
3
4 mainWnd, err := walk.NewMainWindow()
5if err != nil {
6return
7 }
8
9 mw := &MainWindow{MainWindow: mainWnd}
10
11 mw.SetSize(walk.Size{120, 150})
12 mw.Show()
13 mw.Run()
2 创建控件:
button1, _ := walk.NewPushButton(mw)
button1.SetText("start port 8000")
button1.SetX(10)
button1.SetY(10)
button1.SetWidth(100)
button1.SetHeight(30)
button1.Clicked().Attach(func() {
go NewTalkWindow(mw, 8000, 8001)
button1.SetEnabled(false)
})
创建UI基本就靠这两步就⾏了,当然walk还有更为复杂的控件使⽤⽅法,这⾥没有使⽤。
3 业务逻辑
func (this *TalkWindow)Send() error {
txt := this.SendText.Text()
conn, err := net.Dial("tcp", "localhost:" + strconv.Itoa(this.SendPort))
if err != nil {
return errwindows开发平台
}
lenth := len([]byte(txt))
pre := Int32ToStream(int32(lenth),BigEndian)
fmt.Fprintf(conn, string(pre) + txt)
this.SendText.SetText("")
return nil
}
func (this *TalkWindow)Listen() error {
ln, err := net.Listen("tcp", ":" + strconv.Itoa(this.ListenPort))
if err != nil {
return err
}
for {
conn, err := ln.Accept()
if err != nil {
continue
}
go func(){
buffer := make([]byte, 4)
conn.Read(buffer)
lenth := StreamToInt32(buffer, BigEndian)
contentBuf := make([]byte, lenth)
conn.Read(contentBuf)
text := strings.TrimSpace(string(contentBuf))
fmt.Println(text)
this.ShowText.SetText(this.ShowText.Text() + time.Now().Format("2006-01-
02 10:13:40") + breakChars + strconv.Itoa(this.SendPort) + ":" + text + "\r\n")
}()
}
return nil
}
UI创建完成后就是具体的业务逻辑了,这⾥的业务逻辑⽐较简单,主要使⽤了net包建⽴和监听tcp端⼝。
总结
使⽤Go相较于C#获益更多的是在逻辑实现⽅⾯,⽐如在C#中开启多进程,⼀个进程监听消息⼀个进程收取消息,这样的实现是⽐较⿇烦和繁琐的,需要使⽤thread库。但是在Go中是使⽤goroutine实现的,直接开⼀个goroutine来监听消息,主进程发送消息,很符合思维逻辑的编程⽅式。
Go相较于C#不⾜的应该说是IDE⽅⾯了,Go还没有能可视化编程应⽤IDE。但是walk库使⽤熟练了,我想这应该不是问题,⽽且也有理由相信在不久会出现类似的IDE。
Go在将来有没有可能⽀持移动终端应⽤的开发呢?Android,IOS?据说能使⽤Go开发Android应⽤的要求已经提上议程了,毕竟都是google的孩⼦嘛。⾄于IOS可能还有很长的路要⾛。
ps: 截⽌⾄2012/11/6,walk的更新版本已经把 walk.Initialize去掉了,换成其他函数了,故本⽂中的例⼦请做相应修改
具体可以看这个comment
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论