Go編寫一個簡單的web服務(wù)器

Go是一款靜態(tài)里語言,特點就是擁有極好的并發(fā)編程體驗。下面是使用Go實現(xiàn)的一個并發(fā),非阻塞的web服務(wù)器。

代碼

    package main

    import (
        "fmt"
        "net/http"
        "strings"
        "log"
    )

    func sayhelloName(w http.ResponseWriter, r *http.Request) {
        r.ParseForm()  //解析參數(shù),默認是不會解析的
        fmt.Println(r.Form)  //這些信息是輸出到服務(wù)器端的打印信息
        fmt.Println("path", r.URL.Path)
        fmt.Println("scheme", r.URL.Scheme)
        fmt.Println(r.Form["url_long"])
        for k, v := range r.Form {
            fmt.Println("key:", k)
            fmt.Println("val:", strings.Join(v, ""))
        }
        fmt.Fprintf(w, "Hello astaxie!") //這個寫入到w的是輸出到客戶端的
    }

    func main() {
        http.HandleFunc("/", sayhelloName) //設(shè)置訪問的路由
        err := http.ListenAndServe(":9090", nil) //設(shè)置監(jiān)聽的端口
        if err != nil {
            log.Fatal("ListenAndServe: ", err)
        }
    }

代碼解析

package main 表示的是包名,需要在文件的第一行聲明,package main這個包名表示go程序是一個可獨立運行的程序,每一個go程序都應當有一個main為名稱的包。
import 導入需要使用到的類庫,這里和python已經(jīng)java都類似。其中fmt——Formatting包含了一些格式化的IO操作。
func sayhelloName 在go當中,函數(shù)使用func聲明,后面跟函數(shù)名,然后是參數(shù),go當中聲明一個變量的類型的時候會把類型寫在后面比如var a int。sayhelloName這個函數(shù),w的數(shù)據(jù)類型是http.ResponseWriter,用于響應http。r是一個http.Request指針,用于接受請求。
main main()函數(shù) 其中http.HandleFunc用于處理路由,ListenAndServer用來監(jiān)聽請求。
log log主要用來在命令行狀態(tài)下輸出日志

關(guān)于并發(fā)

ListenAndServe

上面這個小服務(wù)器通過 ListenAndServe 來監(jiān)聽端口提供服務(wù),其中使用了關(guān)鍵詞 go 創(chuàng)建了一個 conn。其中g(shù)o是Go語言當中創(chuàng)建線程的關(guān)鍵詞,其中g(shù)o包含了幾個goruntime的協(xié)程。在go的線程管理器中協(xié)程之間可以通過channel互相通信,其中使用conn關(guān)鍵詞來使用channel。

Go編寫一個簡單的web服務(wù)器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容