iT邦幫忙

2022 iThome 鐵人賽

DAY 10
0
DevOps

Golang X DevOps系列 第 10

Day10 - 完成你的指令 讓它屬於你

  • 分享至 

  • xImage
  •  
  • 昨天我們完成了她介紹的部分
  • 今天我們要把它的功能補齊

把需要的package補齊

  • 我們需要http的包來完成ping功能的實作
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 的形式
    • 有 GET、POST......
  • 利用 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)
	}

試用一下 指令

  • 在cmd打上
go run main.go net ping --url google.com

  • 看到 status code 200 就完成了喔

上一篇
Day09 - 增加command info
下一篇
Day11 - 淺談一下 Microservices
系列文
Golang X DevOps30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言