使用golang编写一个windows-GUI应用

本着技多不压身的精神,我最近叕学习了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
75
package 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("获取完成")
}

效果如下:
screenshot.png

由于GO语言本身就是为高并发设计的编程语言,是C语言的升级版,在如今的云计算时代有着不可估量的潜力。所以,我打算把GO作为既java,python之后的第三个必须掌握的编程语言。

记第一次tensorflow实践

1. 下载安装

我个人建议用docker安装,这样不用被安装时候环境的各种依赖困扰,简单方便。
官方tensorflow的docker地址:Link

官方的地址下载很慢甚至连接失败,比如我就是。
docker_pull_tensorflow_failed

所以我找了个国内的镜像地址下载。

1
docker pull daocloud.io/daocloud/tensorflow:latest

docker_pull_tensorflow

下载的东西有点多(解压后1.25G),需要等待一些时间。
docker_tensorflow_size

Read More

关于异步(async)IO和非阻塞(non-blocking)IO

今天看到有个人在某论坛问:异步IO是不是就是非阻塞IO,非阻塞IO是不是就是异步IO?
答案当然是否定的。
依稀记得之前看到过有个人比喻的很形象,你去相关部分盖个章:

  • 同步+阻塞:你必须在窗口等着,等人来办完了才能走
  • 同步+非阻塞:你可以出去转转或者干别的,人来了办完再走
  • 异步+非阻塞:你把材料留下然后回家做其他事情,他们盖完章快递给你
  • 异步+阻塞:你把材料留下,然后必须等着,他们盖完章快递给你

Read More

java面试知识点整理(未完待续)

J2SE基础

九种基本数据类型的大小,以及他们的封装类

java提供的九种基本数据类型:boolean、byte、char、short、int、long、float、double、void
以及它们的封装类:Boolean、Byte、Character、Short、Integer、Long、Float、Double、Void

Switch能否用string做参数

能,这是Java1.7之后的特性

equals与==的区别

==是比较引用是否相等。equals是比较对象的值是否相等,可以自己重写对象的次方法

Object有哪些公用方法
  • clone 实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常
  • equals在Object中与==是一样的,子类一般需要重写该方法
  • hashCode 该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到
  • getClass final方法,获得运行时类型
  • wait 使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。
    wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。 调用该方法后当前线程进入睡眠状态,直到以下事件发生:
    1. 其他线程调用了该对象的notify方法
    2. 其他线程调用了该对象的notifyAll方法
    3. 其他线程调用了interrupt中断该线程
    4. 时间间隔到了,此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常
  • notify 唤醒在该对象上等待的某个线程
  • notifyAll 唤醒在该对象上等待的所有线程
  • toString 转换成字符串,一般子类都有重写,否则打印句柄

Read More