軟體技術-Golang零基礎開發網站伺服器
歡迎關注我的專欄( つ•̀ω•́)つ【人工智慧通識】
如何開始一個最簡單的Golang專案?

請先參照上一篇文章 搭建Golang的vsCode開發環境
專案結構
在 $GOPATH
目錄下一般都要有兩個資料夾:
- 存放編譯結果的bin,
- 存放程式碼檔案的src。

而 src
資料夾又一般會包含兩類程式碼檔案
-
go get
和go install
安裝的別人的程式碼,根據來源不同分為github.com
和golang.org
兩個資料夾; - 自己手寫的程式碼,放在任意名字的資料夾,比如
app
資料夾。
我們編寫的程式肯定要從某個程式碼檔案開始,我們可以在自己的資料夾下建立 app.go
或者叫 main.go
都可以。
Hello World
開啟 app.go
撰寫下面內容:
package main import ( "fmt" ) func main() { fmt.Println("Hello world!") }
這三段程式碼的意思是:
- 這個程式碼檔案是首要檔案main;
- 我要匯入
fmt
模組; - 從
main
開始執行,先列印一個Hello world!
當你Ctrl+S儲存的時候程式碼會自動被格式化,如果出錯的話某些程式碼可能會消失,下面的PROBLEMS問題面板也會有說明。
然後右鍵可以 Run code
執行程式碼,在下面的OUTPUT輸出面板可以看到 Hello world!
字樣。
最簡伺服器程式
我們知道,瀏覽一個網站的時候都要有伺服器上執行的軟體才行,我們告訴伺服器要訪問的網址(URL),伺服器軟體就會把對應的內容傳送到我們的瀏覽器上。
下面的程式碼可以搭建一個最簡單的網站伺服器(實際你只要複製貼上 main
中的內容,而 import
中的內容會自動補全):
package main import ( "fmt" "html" "log" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, URL is %q", html.EscapeString(r.URL.Path)) }) log.Fatal(http.ListenAndServe(":8080", nil)) }
http
是用來建立伺服器的功能模組, main
函式中的程式碼意思是:
-
http.HandleFunc
是設定對訪問地址URL(比如http://www.baidu.com/search
)的怎麼做出反應的方法; -
fmt.Fprintf...
是說要返回給使用者瀏覽器的內容,這裡是Hello,URL is...
,而這裡的%q
就是後面html.Esca...
的內容,其實就是URL的路徑名。 - 最後
http.ListenAndServe
就是在8080埠啟動服務監聽,如果啟動失敗的話log.Fatal
會在OUTPUT提示錯誤。
右鍵執行程式碼,在OUTPUT會提示 [running]...
表示服務軟體開始執行,你可以訪問自己的網站啦!怎麼訪問呢?開啟瀏覽器,輸入這個地址 http://localhost:8080/hello
就可以看到結果,當然如果你輸入 http://localhost:8080/nihao
就會看到 Hello, URL is "/nihao"
。
如果發生意外,可以在OUTPUT面板右擊,找到 Stop Code Run
停止後再重新 Code Run
執行。

自定義模組
我們的網站對所有的訪問地址URL都是一樣的處理,這不行。我們需要為每個URL使用不同的規則。
我們的確可以在 main
裡面寫很多 http.HandleFunc("/", func(...
,但那樣 main
裡面就會很長,也許有幾百幾千行還要多,這樣會很亂。
如果我們能把每個URL響應規則寫在單獨的模組檔案裡面,那就清爽了。
我們再 src
下建個 login
資料夾,裡面建一個 login.go
檔案,如下圖所示:

然後我們編寫 login.go
這個模組檔案內容:
package login import ( "fmt" "net/http" ) //HandleFunc is the handler function func HandleFunc(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Please Login or Regiter.") }
注意兩個事情:
- 第一行是
package login
表示這是login
模組(app.go
中叫main
是因為那是起始檔案)。 -
func HandleFunc(...
是從app.go
那邊抄來的,注意HandleFunc
如果寫成handleFunc
就錯了,這個模組就沒用了。務必要首字母大寫。這個方法我們只是返回一個"Please Login or Regiter."
歡迎登入或註冊文字。
寫好了 login
模組,我們就可以在 app.go
中使用它了:
package main import ( "app/login" "fmt" "html" "log" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, URL is %q", html.EscapeString(r.URL.Path)) }) http.HandleFunc("/login", login.HandleFunc) log.Fatal(http.ListenAndServe(":8080", nil)) }
這裡我們增加了兩個地方:
-
import
中增加了app/login
,匯入我們自己寫的模組; -
main
中增加了http.HandleFunc("/login", login.HandleFunc)
設定當使用者要求訪問/login
的時候我們就用自定義的login.HandleFunc
返回給他那個"Please Login or Regiter."
。
好了,OUTPUT面板 Stop Code Run
然後程式碼上右擊 Code Run
,正常 [Running]
之後開啟瀏覽器,嘗試訪問 http://localhost:8080/login
可以看到伺服器返回的提示,如果你訪問其他頁面,仍然會被 http.HandleFunc("/", func(...
接收並返回原來的資訊。

結尾
如果你希望脫離VSCode執行自己編寫的這個伺服器軟體,首先要在VSCode裡面 Stop Code Run
,然後在命令列中利用 cd ..
命令進入到 src
的上層資料夾(即 $GOPATH
資料夾),然後執行 go install app
就會把app檔案編譯成為可以單獨執行的檔案,位於 bin
資料夾下。
然後你就可以把這個 app
可執行檔案雙擊或者拖拽到命令列工具中執行它。注意在MacOS下你需要使用 Ctrl+C
來終止正在執行中的 app
可執行檔案。如果總是提示 Port Already in use
,實在不行就重啟電腦吧。
我們只是一個簡單的開始,實際上每個URL的處理並不會這麼簡單,往往還要分析使用者資料,檢查他是誰,做一些固定的額外處理,然後讀取我們的資料庫,為他組裝內容,或者讀取特定的網頁返回給他,步驟很多而且情況都很不一樣。在後續的文章中我會逐漸和大家一起學習。
歡迎關注我的專欄( つ•̀ω•́)つ【人工智慧通識】
每個人的智慧新時代
如果您發現文章錯誤,請不吝留言指正;
如果您覺得有用,請點喜歡;
如果您覺得很有用,歡迎轉載~
END