對於很多現代應用來說,訪問網際網路上的資訊和訪問本地檔案系統一樣重要。Go語言在net
這個強大package的幫助下提供了一系列的package來做這件事情,使用這些包可以更簡單地用網路收發資訊,還可以建立更底層的網路連線,編寫伺服器程式。在這些情景下,Go語言原生的的併發特性顯得尤其好用。
下面給出一個示例程式fetch,這個程式獲取對應的url,並將其原始檔列印出來。
// Fetch prints the content found at a URL
package main
import (
"fmt"
"io/ioutil"
"net/http"
"os"
)
func main() {
//讀取url
var url string
if len(os.Args) != 2 {
fmt.Fprintln(os.Stderr, "Paramater number error!")
os.Exit(1)
} else {
url = os.Args[1]
}
//get請求url
resp, err := http.Get(url)
if err != nil {
fmt.Fprintf(os.Stderr, "fetch url(%s) failed: %v\n", url, err)
os.Exit(1)
}
//處理請求返回內容
data, err := ioutil.ReadAll(resp.Body)
resp.Body.Close()
if err != nil {
fmt.Fprintf(os.Stderr, "fetch: reading error: %v\n", err)
os.Exit(1)
}
fmt.Printf("%s", data)
}
複製程式碼
http.Get
函式是建立HTTP
請求的函式,如果獲取過程沒有出錯,那麼會在resp
這個結構體中得到訪問的請求結果。resp
的Body
欄位包括一個可讀的伺服器響應流。ioutil.ReadAll
函式從response
中讀取到全部內容,將其結果儲存在變數data
中,這是一個位元組切片。resp.Body.Close
關閉resp
的Body
流,防止資源洩露。
事實上,我們在處理伺服器響應資訊時只是簡單的輸出,當前的邏輯舉個形象的例子就是:我們從輸入口(伺服器響應流
)獲取水(響應資訊
),放到了池子(記憶體
)中,然後把水接到了輸出口(os.Stdout
)。我們完全可以直接把輸入口和輸出口連線起來即可,示例程式碼如下:
// Fetch prints the content found at a URL
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
//讀取url
var url string
if len(os.Args) != 2 {
fmt.Fprintln(os.Stderr, "Paramater number error!")
os.Exit(1)
} else {
url = os.Args[1]
}
//get請求url
resp, err := http.Get(url)
if err != nil {
fmt.Fprintf(os.Stderr, "fetch url(%s) failed: %v\n", url, err)
os.Exit(1)
}
//處理請求返回內容
_, err = io.Copy(os.Stdout, resp.Body)
resp.Body.Close()
if err != nil {
fmt.Fprintf(os.Stderr, "fetch: reading error: %v\n", err)
os.Exit(1)
}
}
複製程式碼
因為我們沒有對響應資訊進行處理,因此可以直接使用os.Copy
將資訊從可讀的伺服器響應流
拷貝到可寫的標準輸出流
。