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。