Tre anni dopo che mio marito mi ha lasciato per unamica, il nostro incontro inaspettato per strada mi ha fatto sorridere.
Mio marito mi ha lasciata per la mia migliore amica dinfanzia dopo che ho avuto un aborto spontaneo. Tre anni dopo, li ho visti a una stazione di servizio e non riuscivo a smettere di sorridere
Quando mio marito ha iniziato a distanziarsi, ho cercato conforto nella mia migliore amica. Lei mi diceva che stavo esagerando. Ma non era così. Tre anni dopo, il destino mi ha mostrato le conseguenze del loro tradimento.
Credevo sempre che i tradimenti accadessero agli altri, che fossero solo storie drammatiche o pettegolezzi da cena. Ma non a me. Non a noi.
Per cinque anni, io e Luca abbiamo costruito una vita insieme. Non era lussuosa, ma era la nostra: serate a guardare film sul divano, domeniche mattina a prendere il caffè al bar, battute che solo noi due capivamo.
E per tutto quel tempo cera Sofia, la mia migliore amica dalle elementari, la mia sorella per tutto tranne che per il sangue. È stata presente in ogni momento importante, incluso il mio matrimonio, dove mi è stata accanto come damigella, stringendomi le mani e piangendo di felicità.
Quando sono rimasta incinta, pensavo fosse solo un altro capitolo della nostra vita perfetta.
Ma poi Luca è cambiato.
Allinizio erano piccole cose: restava fino a tardi al lavoro, il suo sorriso non arrivava più agli occhi. Poi è peggiorato. Quasi non mi guardava. Le conversazioni si riducevano a monosillabi. Di notte, mi voltava le spalle, come se non esistessi.
Non capivo cosa stesse succedendo. Ero esausta, incinta di molti mesi, e cercavo disperatamente di sistemare ciò che si era rotto tra noi.
Così mi sono rivolta a Sofia.
Non so cosa sta succedendo singhiozzavo al telefono, rannicchiata nel# 12.5 使用Go語言建立Web服務器
前兩小節我們學習瞭如何通過Socket和HTTP來寫網路應用但是很多時候我們要實現的Web應用主要是基於HTTP協定的,用Socket會比較底層,需要自己封裝的比較多,其實Go語言本身已經提供了非常方便的架設HTTP Web服務器的標準庫,而且我們在第8章的時候也看到了一個簡單的使用net/http包架設的Web伺服器
## 基於HTTP的Web服務器
“`Go
package main
import (
“fmt”
“net/http”
“strings”
“log”
)
func sayhelloName(w http.ResponseWriter, r *http.Request) {
r.ParseForm() //解析參數,默認是不會解析的
fmt.Println(r.Form) //這些資訊是輸出到伺服器端的列印資訊
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) //設定訪問的路由
err := http.ListenAndServe(“:9090”, nil) //設定監聽的埠
if err != nil {
log.Fatal(“ListenAndServe: “, err)
}
}
“`
上面的程式碼我們build之後,然後執行web.exe,這個時候其實已經在9090埠監聽http連結請求了
在瀏覽器輸入`http://localhost:9090`
可以看到瀏覽器頁面輸出了`Hello astaxie!`
可以換一個地址試試:`http://localhost:9090/?url_long=111&url_long=222`
看看瀏覽器輸出的是什麼,伺服器輸出的是什麼?
在伺服器端輸出的資訊如下:
圖3.9 用戶訪問Web之後伺服器端列印的資訊
我們看到上面的程式碼,要編寫一個Web伺服器很簡單,只要呼叫http包的兩個函式就可以了
>如果你以前是PHP程式設計師,那你也許會問,我們的nginxapache伺服器不需要嗎?Go就是不需要這些,因為他直接就監聽tcp埠了,做了nginx做的事情,然後sayhelloName這個其實就是我們寫的邏輯函式了,跟php裡面的控制層(controller)函式類似
>如果你以前是Python程式設計師,那麼你一定聽說過tornado,這個程式碼和他是不是很像,對,沒錯,Go就是擁有類似Python這樣動態語言的特性,寫Web應用的速度很快
>如果你以前是Ruby程式設計師,會發現和ROR的/script/server啟動有點類似
我們看到Go透過簡單的幾行程式碼就已經執行起來一個Web服務了,而且這個Web服務內部有支援高併發的特性,我將會在接下來的兩個小節裡面詳細的講解一下Go是如何實現Web高併發的
## Links
* [目錄](
* 上一節: [REST](<12.4.md>)
* 下一節: [Go如何使得Web工作](<12.6.md>)




