Go是一款靜態(tài)里語言辨绊,特點(diǎn)就是擁有極好的并發(fā)編程體驗(yàn)悬钳。下面是使用Go實(shí)現(xiàn)的一個(gè)并發(fā),非阻塞的web服務(wù)器棘捣。
代碼
package main
import (
"fmt"
"net/http"
"strings"
"log"
)
func sayhelloName(w http.ResponseWriter, r *http.Request) {
r.ParseForm() //解析參數(shù)辜腺,默認(rèn)是不會(huì)解析的
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!") //這個(gè)寫入到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這個(gè)包名表示go程序是一個(gè)可獨(dú)立運(yùn)行的程序评疗,每一個(gè)go程序都應(yīng)當(dāng)有一個(gè)main為名稱的包。
import 導(dǎo)入需要使用到的類庫茵烈,這里和python已經(jīng)java都類似百匆。其中fmt——Formatting包含了一些格式化的IO操作。
func sayhelloName 在go當(dāng)中呜投,函數(shù)使用func聲明加匈,后面跟函數(shù)名,然后是參數(shù)仑荐,go當(dāng)中聲明一個(gè)變量的類型的時(shí)候會(huì)把類型寫在后面比如var a int
雕拼。sayhelloName這個(gè)函數(shù),w的數(shù)據(jù)類型是http.ResponseWriter粘招,用于響應(yīng)http啥寇。r是一個(gè)http.Request指針,用于接受請求洒扎。
main main()函數(shù) 其中http.HandleFunc用于處理路由辑甜,ListenAndServer用來監(jiān)聽請求。
log log主要用來在命令行狀態(tài)下輸出日志
關(guān)于并發(fā)
ListenAndServe
上面這個(gè)小服務(wù)器通過 ListenAndServe 來監(jiān)聽端口提供服務(wù)逊笆,其中使用了關(guān)鍵詞 go 創(chuàng)建了一個(gè) conn栈戳。其中g(shù)o是Go語言當(dāng)中創(chuàng)建線程的關(guān)鍵詞,其中g(shù)o包含了幾個(gè)goruntime的協(xié)程难裆。在go的線程管理器中協(xié)程之間可以通過channel互相通信,其中使用conn關(guān)鍵詞來使用channel镊掖。