《golang筆記》第四篇-網路客戶端

BackSlash發表於2018-10-24

    對於很多現代應用來說,訪問網際網路上的資訊和訪問本地檔案系統一樣重要。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這個結構體中得到訪問的請求結果。respBody欄位包括一個可讀的伺服器響應流。ioutil.ReadAll函式從response中讀取到全部內容,將其結果儲存在變數data中,這是一個位元組切片。resp.Body.Close關閉respBody流,防止資源洩露。

事實上,我們在處理伺服器響應資訊時只是簡單的輸出,當前的邏輯舉個形象的例子就是:我們從輸入口(伺服器響應流)獲取水(響應資訊),放到了池子(記憶體)中,然後把水接到了輸出口(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將資訊從可讀的伺服器響應流拷貝到可寫的標準輸出流


相關文章