- 昨天我們完成了她介紹的部分
- 今天我們要把它的功能補齊
把需要的package補齊
import (
"fmt"
"net/http"
"time"
"github.com/spf13/cobra"
)
設定參數
- 在你要控制整個 http header 的時候 你需要先設好一個 client 變數
- 在原本 urlPath 的下方新增一個 client 變數
- time.second 的作用會讓輸出變成單位時間為秒
var (
urlPath string
client = http.Client{
Timeout: time.Second * 2,
}
)
實作 ping function
- 接下來我們要來實作 ping 的主要實體
- 一開始先設定要 ping 的 URL
- 接著用
http.NewRequest
來設定你 request 的形式
- 利用
Do
來把 request 發送出去
- 而
resp.Body.Close()
這一行 是為了關閉 TCP connect , 沒有了這一行 你下次會吃到跟上次一樣的 header
- 還有你不關掉的話 你會導致 proess 打開的 fd 越來越多
- 文件上有說一定要用
- 最後返回 status code
func ping(domain string) (int, error) {
url := "http://" + domain
req, err := http.NewRequest("HEAD", url, nil)
if err != nil {
return 0, err
}
resp, err := client.Do(req)
if err != nil {
return 0, err
}
resp.Body.Close()
return resp.StatusCode, nil
}
把 pingCmd function 補齊
- 我們把 ping 導入到 呼叫 pingCmd 的 function 就好了
var pingCmd = &cobra.Command{
Use: "ping",
Short: "ping the remote url and return response",
Long: ``,
Run: func(cmd *cobra.Command, args []string) {
if resp, err := ping(urlPath); err != nil {
fmt.Println(err)
} else {
fmt.Println(resp)
}
},
}
在init() function 中設定 error handling
pingCmd.Flags().StringVarP(&urlPath, "url", "u", "", "The url to ping")
// 補上下面這一句
if err := pingCmd.MarkFlagRequired("url"); err != nil {
fmt.Println(err)
}
試用一下 指令
go run main.go net ping --url google.com
- 看到 status code 200 就完成了喔