一直挺想用 go 的,但是没想到能干啥,前段时间正好有个任务导入 Excel 到后台数据库,用 Python 的话我可能分分钟就写好了,但是作死的我就想试下 go,因为 go 可以打包成可执行程序包,然后就可以不依赖 go 的环境。
直接编码
使用 flag 获取终端参数解析
path := flag.String("path", "", "excel 路径")
url := flag.String("url", "**", "服务器地址")
flag.Parse()
这里定义了 path 路径和服务器地址 url,唯一需要注意的是,这里变量返回都是指针。flag 有个好处,他的参数都是形如(defaultValue,$description),所以在执行 -h
的时候,都会返回 key 以及对应的 description。
使用 Luxurioust/excelize 读取Excel文件
xlsx, err := excelize.OpenFile(*path)
rows := xlsx.GetRows("Sheet1")
for r, row := range rows {
fmt.Println(r)
for c, col := range row {
fmt.Println(c)
fmt.Println(col)
}
}
这个包用起来还是很舒服,唯一一点只支持 xlsx 格式,对于老版本的 xls 格式可能需要先转化了才能使用。rows 为一个二维数组,参数为 sheet 名称,默认的名称都是 Sheet1
使用自带的 net/http 发送请求
str, _ := json.Marshal(data)
resp, err := http.Post(url,
"application/json",
strings.NewReader(string(str)))
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Println(string(body))
go 自带的的 http 就是这么好用,post 形式发送了一个 json 包,这个 jsonEncode 用起来稍微有点不爽但是也还好。
打包程序
$ go build main.go
就可以将这个脚本打包成一个可执行文件了,但是发现文件还挺大的,我以为只有几百 k 呢,都 8m 多了
压缩程序
$ brew install upx
$ upx main
upx 是一个专门的压缩打包可执行文件的程序,可以优化包体积。
这里压缩过的包不能使用了,暂时没有深究什么原因。所以寻找其他方式
再次优化
$ go build -ldflags -w main.go
发现这样弄就可以减少 1m 的体积,还是挺可观的,现在有一个可执行文件了,不用对方有 golang 环境,拿过去直接可以运行跑起来。go 就是优秀!