日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

simple go web application 二维码生成 打包部署

發(fā)布時(shí)間:2025/4/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 simple go web application 二维码生成 打包部署 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

go語(yǔ)言簡(jiǎn)易web應(yīng)用 & 二維碼生成及解碼 & 打包部署

轉(zhuǎn)載請(qǐng)注明出處: https://www.cnblogs.com/funnyzpc/p/10801476.html

前言(閑扯)

(20190503)我知道今天會(huì)有其他活動(dòng),因此我提前買了杯咖啡, (20190504)我知道深夜會(huì)完不成博客, 因此我加班到了這個(gè)點(diǎn)。 首先需要做的事情,Demo 準(zhǔn)備并調(diào)試 還需要做的事情,構(gòu)建github項(xiàng)目 以及要做的事情,README文檔編寫 最后要做的事情,生成一篇博客

簡(jiǎn)單WEB應(yīng)用

話說(shuō)一個(gè)簡(jiǎn)單的WEB應(yīng)用需要多少行依賴,多少行代碼,運(yùn)行需要多大的package,需要多大的運(yùn)行環(huán)境?

  • 對(duì)于java:
    • 我需要構(gòu)建下面這些包(5MB+)
    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(依賴注入)的基礎(chǔ)實(shí)現(xiàn)05) spring-context-3.2.8.RELEASE.jar Spring提供在基礎(chǔ)IoC功能上的擴(kuò)展服務(wù)06) spring-core-3.2.8.RELEASE.jar??????Spring的核心包07) spring-expression-3.2.8.RELEASE.jar? Spring表達(dá)式語(yǔ)言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標(biāo)準(zhǔn)標(biāo)簽庫(kù)
    • 需要編寫以下代碼(14行+)
    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";}}
    • 打包(jar or war 5MB+)
    • 部署和環(huán)境(jdk 100MB+ , tomcat 5MB+ total:105MB+)
  • 對(duì)于Go
    • 需要代碼(15行+)
    package mainimport ("fmt""log""net/http" )func main() {http.HandleFunc("/", index)log.Println("請(qǐng)?jiān)L問(wèn):", "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") }
    • 打包(<6MB,upx加殼<2MB)
    • 部署和環(huán)境(<6MB or <2MB)

結(jié)論:一個(gè)java web應(yīng)用部署不小于100MB,而一個(gè)go web應(yīng)用最少只需要2MB,你真的沒(méi)聽(tīng)錯(cuò)他真的很小而且迅速,唯一不能比的是
java的生態(tài) 太龐大了,這是java之所以存在的優(yōu)勢(shì),不過(guò)這終將成為歷史。

(以上 go 代碼在這里:simpleServer.go)

二維碼生成及解碼

二維碼簡(jiǎn)稱(QR CODE),中文全名叫快速響應(yīng)碼,他的基礎(chǔ)基礎(chǔ)包含:向量運(yùn)算、字符編碼、圖形識(shí)別等,需要具體了解的可涉獵此
二維碼原理,這里不再?gòu)乃惴ǖ讓娱_(kāi)始寫起(畢竟大多數(shù)人都不會(huì)哈),
主要用到了開(kāi)源都兩個(gè)依賴(編碼和解碼)

  • 二維碼生成

    這里用到了go-qrcode

  • Demo主要邏輯(已調(diào)試通過(guò))
// 寫二維碼func writeQrCode() {// 寫二維碼err := qrcode.WriteFile("https://funnyzpc.cnblogs.com", qrcode.Medium, 256, "D:/tmp/cnblogs.png")if err != nil {fmt.Println(err)}}
  • 二維碼解碼

    這里用到了qrcode

    • Demo主要邏輯
    func ReadQrCode(){//獲取上傳的第一個(gè)文件file, _, _ := os.Open("本地文件路徑")// 讀取文件qrmatrix, err := rQrCode.Decode(file)defer file.Close()if err != nil {fmt.Println(err.Error())return}log.Println("獲取到二維碼內(nèi)容:", qrmatrix.Content) }

二維碼解析+WEB服務(wù)

一個(gè)產(chǎn)品的終態(tài)必將是一些列技術(shù)的組合,比如搭建一個(gè)在線的二維碼解析應(yīng)用。

  • 參考代碼

    func main() {http.HandleFunc("/", IndexAction)http.HandleFunc("/qrCode", ReadQrCode)log.Println("請(qǐng)打開(kāi)頁(yè)面: http://127.0.0.1:2345")http.ListenAndServe(":2345", nil)}// 主頁(yè)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) {//判斷請(qǐng)求方式if request.Method == "POST" {//設(shè)置內(nèi)存大小request.ParseMultipartForm(64 << 20)//獲取上傳的第一個(gè)文件file, _, _ := request.FormFile("qrFile")// 讀取文件qrmatrix, err := rQrCode.Decode(file)defer file.Close()if err != nil {fmt.Println(err.Error())return}log.Println("獲取到二維碼內(nèi)容:", 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")//輸出文件數(shù)據(jù)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)}
  • 最終效果圖

    • 主頁(yè)

    • 結(jié)果

打包部署

對(duì)于部署,在前面java和go的對(duì)比中已經(jīng)提到過(guò),go 應(yīng)用不存在虛擬機(jī),他的代碼是直接從文本編譯成二進(jìn)制包(包含運(yùn)行環(huán)境) 最終也必然是輕巧無(wú)依賴的,
另外,需要說(shuō)的是go 的 打包本身是不加殼的,源包會(huì)比較大,一般部署時(shí)會(huì)做兩個(gè)處理。

  • 使用 -ldflags 去掉符號(hào) 去掉調(diào)試 壓縮體積

  • 同時(shí)使用upx加殼 upx --backup --brute [PACKAGE_FILE_NAME] 以進(jìn)一步壓縮體積(壓縮至1/3),加密軟件包,這樣利于傳輸發(fā)布同時(shí)還能保持原生包的功效哦~

這里我簡(jiǎn)要給出一般的打包命令:

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],或?qū)PACKAGE_FILE.exe]配置為服務(wù)

最后

以上所有代碼均在我的github項(xiàng)目中,若所言有誤懇請(qǐng)指正~

項(xiàng)目地址:qrCodes

轉(zhuǎn)載于:https://www.cnblogs.com/funnyzpc/p/10801476.html

總結(jié)

以上是生活随笔為你收集整理的simple go web application 二维码生成 打包部署的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。