轉載請註明出處: http://www.javashuo.com/article/p-doffjrso-w.htmlhtml
(20190503)我知道今天會有其餘活動,所以我提早買了杯咖啡, (20190504)我知道深夜會完不成博客, 所以我加班到了這個點。 首先須要作的事情,Demo 準備並調試 還須要作的事情,構建github項目 以及要作的事情,README文檔編寫 最後要作的事情,生成一篇博客
話說一個簡單的WEB應用須要多少行依賴,多少行代碼,運行須要多大的package,須要多大的運行環境?java
01) aopalliance-1.0.jar aop的工具包 ` 02) commons-logging-1.1.3.jar commons的日誌管理 03) spring-aop-3.2.8.RELEASE.jar Spring的切面編程 04) spring-beans-3.2.8.RELEASE.jar SpringIoC(依賴注入)的基礎實現 05) spring-context-3.2.8.RELEASE.jar Spring提供在基礎IoC功能上的擴展服務 06) spring-core-3.2.8.RELEASE.jar Spring的核心包 07) spring-expression-3.2.8.RELEASE.jar Spring表達式語言 08) spring-web-3.2.8.RELEASE.jar SpringWeb下的工具包 09) spring-webmvc-3.2.8.RELEASE.jar SpringMVC工具包 10) jstl-1.1.2.jar JSP標準標籤庫
package com.test.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping(value="/hello") public class HelloController { @RequestMapping(value="/world",method=RequestMethod.GET) public String hello(Model model){ model.addAttribute("msg", "你好spring mvc"); return "index"; } }
package main import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/", index) log.Println("請訪問:", "http://127.0.0.1:2222") http.ListenAndServe(":2222", nil) } func index(w http.ResponseWriter, r *http.Request) { fmt.Printf("[%s|%s] -> http://%s%s \n", r.Method, r.Proto, r.Host, r.RequestURI) dateTime := time.Now().Format("2006-01-02 15:04:05") }
結論:一個java web應用部署不小於100MB,而一個go web應用最少只須要2MB,你真的沒聽錯他真的很小並且迅速,惟一不能比的是
java的生態 太龐大了,這是java之因此存在的優點,不過這終將成爲歷史。linux
(以上 go 代碼在這裏:simpleServer.go)git
二維碼簡稱(QR CODE),中文全名叫快速響應碼,他的基礎基礎包含:向量運算、字符編碼、圖形識別等,須要具體瞭解的可涉獵此
二維碼原理,這裏再也不從算法底層開始寫起(畢竟大多數人都不會哈),
主要用到了開源都兩個依賴(編碼和解碼)github
二維碼生成web
這裏用到了go-qrcode算法
// 寫二維碼 func writeQrCode() { // 寫二維碼 err := qrcode.WriteFile("https://funnyzpc.cnblogs.com", qrcode.Medium, 256, "D:/tmp/cnblogs.png") if err != nil { fmt.Println(err) } }
二維碼解碼spring
這裏用到了qrcodeexpress
func ReadQrCode(){ //獲取上傳的第一個文件 file, _, _ := os.Open("本地文件路徑") // 讀取文件 qrmatrix, err := rQrCode.Decode(file) defer file.Close() if err != nil { fmt.Println(err.Error()) return } log.Println("獲取到二維碼內容:", qrmatrix.Content) }
一個產品的終態必將是一些列技術的組合,好比搭建一個在線的二維碼解析應用。編程
參考代碼
func main() { http.HandleFunc("/", IndexAction) http.HandleFunc("/qrCode", ReadQrCode) log.Println("請打開頁面: http://127.0.0.1:2345") http.ListenAndServe(":2345", nil) } // 主頁 func IndexAction(writer http.ResponseWriter, request *http.Request) { t, err := template.ParseFiles("template/page/index.html") if err != nil { log.Println(err) } t.Execute(writer, nil) } type QrCode struct { QrContent string } // 讀取二維碼 func ReadQrCode(writer http.ResponseWriter, request *http.Request) { //判斷請求方式 if request.Method == "POST" { //設置內存大小 request.ParseMultipartForm(64 << 20) //獲取上傳的第一個文件 file, _, _ := request.FormFile("qrFile") // 讀取文件 qrmatrix, err := rQrCode.Decode(file) defer file.Close() if err != nil { fmt.Println(err.Error()) return } log.Println("獲取到二維碼內容:", qrmatrix.Content) t, err := template.ParseFiles("template/page/qrCode.html") if err != nil { log.Println(err) } t.Execute(writer, QrCode{QrContent: qrmatrix.Content}) } else { //解析模板文件 t, _ := template.ParseFiles("template/page/qrCode.html") //輸出文件數據 t.Execute(writer, nil) } } // 讀二維碼 func readQrCode() { file, error := os.Open("D:/tmp/cnblogs.png") if error != nil { fmt.Println(error.Error()) return } defer file.Close() qrmatrix, err := rQrCode.Decode(file) if err != nil { fmt.Println(err.Error()) return } fmt.Println(qrmatrix.Content) }
最終效果圖
主頁
結果
對於部署,在前面java和go的對比中已經提到過,go 應用不存在虛擬機,他的代碼是直接從文本編譯成二進制包(包含運行環境) 最終也必然是輕巧無依賴的,
另外,須要說的是go 的 打包自己是不加殼的,源包會比較大,通常部署時會作兩個處理。
使用 -ldflags
去掉符號 去掉調試 壓縮體積
同時使用upx加殼 upx --backup --brute [PACKAGE_FILE_NAME]
以進一步壓縮體積(壓縮至1/3),加密軟件包,這樣利於傳輸發佈同時還能保持原生包的功效哦~
這裏我簡要給出通常的打包命令:
linux `GOOS=linux GOARCH=amd64 go build -ldflags "-w -s" ./main.go` window `GOOS=windows GOARCH=amd64 go build -ldflags "-w -s" ./main.go` mac `GOOS=darwin GOARCH=amd64 go build -ldflags "-w -s" ./main.go`
引用加殼命令:
upx --backup --brute [main.exe(windows) or main(linux、mac)]
最後上線部署:
linux: ./[PACKAGE_FILE] & mac: ./[PACKAGE_FILE] & windows: 雙擊[PACKAGE_FILE.exe],或將[PACKAGE_FILE.exe]配置爲服務
以上全部代碼均在個人github項目中,若所言有誤懇請指正~
項目地址:qrCodes