本着技多不压身的精神,我最近叕学习了GO语言。发现GO可以直接编译成EXE文件,可以跑在与编译平台相同的任何机器上。
于是我就想着用一个项目练练手。就写了个windows GUI 应用。目前内容还比较简单,因为这只是刚刚开始,只是输入一个URL,显示请求的响应头,日后会照着这个模板写更多的小工具。
代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75package main
import (
    "bytes"
    "fmt"
    "log"
    "net/http"
    "strings"
    "github.com/lxn/walk"
    . "github.com/lxn/walk/declarative"
)
var (
    outTE   *walk.TextEdit
    urlLE   *walk.LineEdit
    mw      *walk.MainWindow
    tipsSBI *walk.StatusBarItem
)
func main() {
    MainWindow{
        AssignTo: &mw,
        Title:    "HeaderViewer - Design by Akame",
        MinSize:  Size{600, 400},
        Layout:   VBox{Margins: Margins{Left: 5, Right: 5, Bottom: 10}},
        Children: []Widget{
            Composite{
                MaxSize: Size{0, 40},
                Layout:  HBox{},
                Children: []Widget{
                    Label{Text: "URL:"},
                    LineEdit{AssignTo: &urlLE},
                    PushButton{
                        Text: "GET",
                        OnClicked: func() {
                            log.Println("url:", urlLE.Text())
                            go fetchHeader(strings.TrimSpace(urlLE.Text()))
                        },
                    },
                },
            },
            TextEdit{
                Font:     Font{Family: "Courier New", PointSize: 12},
                HScroll:  true,
                VScroll:  true,
                AssignTo: &outTE,
            },
        },
        StatusBarItems: []StatusBarItem{
            StatusBarItem{
                AssignTo: &tipsSBI,
                Text:     "准备就绪",
            },
        },
    }.Run()
}
func fetchHeader(url string) {
    tipsSBI.SetText("正在获取中...")
    resp, err := http.Get(url)
    if err != nil {
        tipsSBI.SetText("获取失败")
        walk.MsgBox(mw, "错误", "网站无法访问或者URL不正确", walk.MsgBoxOK)
        return
    }
    var buf bytes.Buffer
    for k, v := range resp.Header {
        buf.WriteString(fmt.Sprintf("%s: %s\r\n", k, strings.Join(v, "")))
    }
    outTE.SetText(buf.String())
    tipsSBI.SetText("获取完成")
}
效果如下:
由于GO语言本身就是为高并发设计的编程语言,是C语言的升级版,在如今的云计算时代有着不可估量的潜力。所以,我打算把GO作为既java,python之后的第三个必须掌握的编程语言。