# Go 建立一個簡單的 web 服務

前面小節已經介紹了 Web 是基於 http 協議的一個服務，Go 語言裡面提供了一個完善的 net/http 套件，透過 http 套件可以很方便的建立起來一個可以執行的 Web 服務。同時使用這個套件能很簡單地對 Web 的路由，靜態檔案，模版，cookie 等資料進行設定和操作。

## 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`

看看瀏覽器輸出的是什麼，伺服器輸出的是什麼？

在伺服器端輸出的資訊如下：

![](https://4278675773-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M6Ees3f-VcmFu88247C%2Fsync%2Fd6a5382996fb68bdbe0cf046250c7e71706583d3.png?generation=1588327083785710\&alt=media)

圖 3.8 使用者存取 Web 之後伺服器端列印的資訊

我們看到上面的程式碼，要編寫一個 Web 伺服器很簡單，只要呼叫 http 套件的兩個函式就可以了。

> 如果你以前是 PHP 程式設計師，那你也許就會問，我們的 nginx、apache 伺服器不需要嗎？Go 就是不需要這些，因為他直接就監聽 tcp 埠了，做了 nginx 做的事情，然後 sayhelloName 這個其實就是我們寫的邏輯函數了，跟 php 裡面的控制層（controller）函式類似。
>
> 如果你以前是 Python 程式設計師，那麼你一定聽說過 tornado，這個程式碼和他是不是很像，對，沒錯，Go 就是擁有類似 Python 這樣動態語言的特性，寫 Web 應用很方便。
>
> 如果你以前是 Ruby 程式設計師，會發現和 ROR 的/script/server 啟動有點類似。

我們看到 Go 透過簡單的幾行程式碼就已經執行起來一個 Web 服務了，而且這個 Web 服務內部有支援高併發的特性，我將會在接下來的兩個小節裡面詳細的講解一下 Go 是如何實現 Web 高併發的。

## links

* [目錄](https://github.com/doggy8088/build-web-application-with-golang-zhtw/tree/80abfb9f0c5f9f703922f4114d78f2e3c26a4dfb/preface.md)
* 上一節: [Web 工作方式](https://willh.gitbook.io/build-web-application-with-golang-zhtw/03.0/03.1)
* 下一節: [Go 如何使得 web 工作](https://willh.gitbook.io/build-web-application-with-golang-zhtw/03.0/03.3)
