背景
工作中的主力语言是Python,今年要搞性能测试的工具,由于GIL锁的原因,Python的性能实在是惨淡,需要学一门性能高的语言来生成性能测试的压力端。因此我把目光放在了现在的新秀Go。经过一段时间的学习,也写了一个小工具,记一下这两个语言的区别。
需求
工具是一个小爬虫,用来爬某网站的某个产品的迭代记录,实现逻辑就是运行脚本后,使用者从命令行输入某些元素(产品ID等)后,脚本导出一个Excel文件出来。
最初的版本是用Python写的,30行代码不到就搞定了。这次用Go重写,代码量在110行左右。
接受输入
第一步就是接受命令行的输入内容,工具要给非技术人员用的,弄一个CLI不太合适,要的效果就是一行一行的输入内容,用Python实现起来非常容易,像这样:
app_id = raw_input('请输入app_id: ') app_analysis = raw_input('请输入analysis: ')
执行后就是一行一行的往下走,但是用Go就有点蛋疼了,完整的代码如下:
func getPara() (string, string) { var i = 0 var appId, analysis string fmt.Print("请输入appId:") scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { text := scanner.Text() if i == 0 { appId = text fmt.Print("请输入analysis:") } else if i == 1 { analysis = text fmt.Print("程序初始化数据完毕。。。。<em>本文来源[email protected]搞@^&代*@码)网5</em>请按任意键继续") } else { break } i++ } return appId, analysis }
Go要实现CLI很方便,但是涉及到这种一行一行的输入,要一直监听Scan(),所以就有了上面蛋疼的循环处理,而且在必须要先打印信息,再来监听内容,总体的写的过程很恶心,也许是没有找到更好的方法吧,实在是太逆天了。
发送请求
在发送请求方便,两种语言倒是差别不太大,至少我写的Get请求是这样的。
Python params = { "analysis": app_analysis, "appid": app_id, "country": 'cn' } r = requests.get(url, params)
Go q := req.URL.Query() q.Add("appid", appId) q.Add("analysis", analysis) q.Add("country", "cn") req.URL.RawQuery = q.Encode() var resp *http.Response resp, _ = http.DefaultClient.Do(req)
返回结果处理
在返回结果的处理上,Python的处理方式简直是太友好了,直接调用json就处理了。
result = r.json()
但是Go就有点蛋疼了,由于是静态语言,所以解包数据的时候需要先定义数据格式,比如返回的内容必须要先做如下的结构定义:
type ResultInfo struct { Code int Msg string Version []VersionInfo } type VersionInfo struct { Version string `json:"version"` ReleaseTime string `json:"release_time"` ReleaseNote string `json:"release_note"` AppName string `json:"app_name"` SubTitle string `json:"subtitle"` }
第一个ResultInfo是返回的数据,其中的Version也是一个数组对象,所以还要再定义一个数组对象,这样才能调用方法来解包处理。
body, _ := ioutil.ReadAll(resp.Body) var rst = ResultInfo{} if err := json.Unmarshal(body, &rst); err != nil { fmt.Println(err) }
写数据到Excel
这部分调用的都是第三方库,所以没什么可比性,代码的实现完全依赖于第三方包。