Go搭建靜態頁面server筆記

2021-09-14 04:28:38 字數 3345 閱讀 5275

go是一門簡潔強大的語言,簡單體驗之後覺得對於網路和命令列的支援也非常棒,本文介紹一下go實現靜態伺服器的大致流程。

最近接手了gobyexample的翻譯工作,將專案重構後需要本地的測試環境。

由於想要頁面的url顯示為「」這種結尾不帶「/」的形式,子頁面沒有帶上html,並且有資源因此需要乙個static server。

根據golang wiki,實現這個簡單server只需要...一行**:

func main()加入log後稍微改寫一下,放在我們專案的tools目錄下:

}再來乙個可執行的tools/serve檔案

#!/bin/bash

exec go run tools/serve.go

ok現在只需要tools/serve就可以啟動這個伺服器了。

一切看起來很正常,但如果我們訪問一下不存在的某個頁面,404.html並不會被serve,這是因為go提供的fileserver並不知道我們自定義的404頁面。

所以我們需要將http.fileserver改為乙個自定義的handler

寫go的時候體驗特別好的一點就是go官方團隊提供了很opinionated的convention,比如go-get,go-fmt等。

在我們輸入http.fileserver時會自動在imports中新增相應的庫,跳轉到原始碼後看到了這個函式的實現:

}於是我們知道了這裡的函式需要返回的handler有乙個servehttp方法。但是這裡的servefile並不能直接由http.servefile呼叫:go規定乙個package內小寫字母開頭的均為私有,不能被外部package訪問。

但是沒有關係,我們可以在filehandler上再包裝一層**,在執行完我們判斷檔案存在的邏輯後執行原先所有filehandler.servehttp的內容,修改後的**如下:

}在傳入filesystem的時候傳入指標也避免建立,很有c的感覺。

基本功能都已經實現,但作為乙個命令列工具,希望再進行一些完善。

首先我們需要支援傳參,go對於命令列引數的支援非常棒,只要引入builtin的flag包之後,我們加入

port := flag.string("port", ":8080", "localhost port to serve")

path := flag.string("path", "public", "public files path")

flag.parse()

就可以得到*string型別的命令列引數,並且天生支援預設值和描述,測試一下go run tools/serve.go -h,可以得到:

usage of /var/folders/sd/cwk5fwtd4ms5vflhq5_0_5rr0000gn/t/go-build178666598/command-line-arguments/_obj/exe/serve:

-path string

public files path (default "public")

-port string

localhost port to serve (default ":8080")

準備serve檔案之前,再輸出一下帶有格式的資訊加粗一下我們傳入的引數:

log.printf("serving \x1b[1m%s\x1b[0m at: http://localhost\x1b[1m%s\x1b[0m\n", *path, *port)
這裡\x1b[0m代表「all attributes off(color at startup)」,\x1b[1m代表「bold on(enable foreground intensity)」。

go作為靜態語言擁有可以與動態語言媲美的靈活性,有完整易用的工具鏈和豐富的標準庫,是2023年增長最快的語言,簡單的同時非常強大。

希望有更多的人可以一起學習go,我正在完善go by example的翻譯,歡迎閱讀以及貢獻pr!

閱讀原文

Linux 搭建靜態頁面

很多時候由於測試需要,經常搭建測試 下面是個人寫的簡易shell 指令碼,快速搭建靜態頁面,跟搭建分享下 bin bash echo 正在安裝檢測環境!耐心等待 echo 請檢查dns配置 exit 1 fiyum y install curl dev null 安裝curl yum y insta...

Go實現頁面靜態化

tmpl,err template.parsefiles hello.tmpl product,err p.productservice.getproductbyid int64 productid file,err os.openfile filename,os.o create os.o wro...

靜態頁面 動態頁面和偽靜態頁面的區別

1.靜態頁面 優點 相對於其他兩種頁面 動態頁面和偽靜態頁面 速度最快,而且不需要從資料庫裡面提取資料,速度快的同時,也不會對伺服器產生壓力。缺點 由於資料都是儲存在html裡面,所以導致檔案非常大。並且最嚴重的問題是,更改源 必須全部更改,而不能改乙個地方,全站靜態頁面就自動更改了。如果是大型 有...