golang 命令行開發基礎

aside section._1OhGeD · · 149 次點擊 · · 開始瀏覽    

os.Args獲取命令行參數

  • os.Args參數列表
    • 0 :程序路徑(go run 運行 0 為臨時工作目錄的路徑,編譯后運行,0 二進制文件名)
    • 1 第一個參數
    • 2 第二個參數...
    • ...
  • len(os.Args) 參數數量

示例

/**
 * @Author : jinchunguang
 * @Date : 19-11-4 上午10:37
 * @Project : tcp-chat
 */
package main

import (
    "fmt"
    "os"
)

func main() {

    // 獲取命令行參數
    fmt.Println("命令行參數數量:", len(os.Args))
    for k, v := range os.Args {
        fmt.Printf("args[%v]=[%v]\n", k, v)
    }

    fmt.Printf("username=%v password=%v host=%v port=%v ", os.Args[2], os.Args[4], os.Args[6], os.Args[8])

}

run 直接運行

image.png

編譯運行

image.png

flag包獲取命令行參數

/**
 * @Author : jinchunguang
 * @Date : 19-11-4 上午10:37
 * @Project : tcp-chat
 */
package main

import (
    "flag"
    "fmt"
    "os"
)

// 用戶
var username string
// 密碼
var password string
// 主機名
var host string
// 端口號
var port int

func main() {

    /*
    flag 要放在循環外部,不能重復定義
    */

    // 變量,參數名,默認值,解釋說明(-h顯示)
    flag.StringVar(&username, "u", "", "用戶名")
    flag.StringVar(&password, "p", "", "密碼")
    flag.StringVar(&host, "h", "127.0.0.1", "主機地址")
    flag.IntVar(&port, "P", 3306, "端口號")
    flag.Parse()

    // visit只包含已經設置了的flag
    fmt.Println("------ flag遍歷開始 ------")
    flag.Visit(func(f *flag.Flag) {
        fmt.Println(f.Name, f.Value, f.Usage, f.DefValue)
    })
    fmt.Println("------ flag遍歷結束 ------")

    /*
    測試邏輯
    */
    // 用戶名密碼不能為空
    if username == "" || password == "" {
        flag.PrintDefaults()
        fmt.Println("warn: 用戶名,密碼不能為空", username, password)
        os.Exit(1)
    }
    // 用戶名密碼指定為root、root
    if username != "root" || password != "root" {
        flag.PrintDefaults()
        fmt.Println("warn: 用戶名,密碼不正確", username, password)
        os.Exit(1)
    }

    // 打印
    fmt.Printf("參數值:username=%v password=%v host=%v port=%v ", username, password, host, port)
}

用戶名,密碼不能為空

image.png

用戶名,密碼不正確

image.png

正常輸出

image.png

fmt.Scanf()來捕捉輸入

/**
 * @Author : jinchunguang
 * @Date : 19-11-4 上午10:37
 * @Project : tcp-chat
 */
package main

import (
    "fmt"
)

// 用戶
var username string
// 密碼
var password string
// 主機名
var host string
// 端口號
var port int

func main() {
    fmt.Println("請輸入用戶名:")
    if _, err := fmt.Scanf("%s", &username); err != nil {
        fmt.Printf("%s\n", err)
        return
    }

    fmt.Println("請輸入密碼:")
    if _, err := fmt.Scanf("%s", &password); err != nil {
        fmt.Printf("%s\n", err)
        return
    }

    fmt.Println("請輸入主機地址:")
    if _, err := fmt.Scanf("%s", &username); err != nil {
        fmt.Printf("%s\n", err)
        return
    }

    fmt.Println("請輸入端口:")
    if _, err := fmt.Scanf("%s", &username); err != nil {
        fmt.Printf("%s\n", err)
        return
    }
    // 打印
    fmt.Printf("參數值:username=%v password=%v host=%v port=%v ", username, password, host, port)

}

示例


image.png

bufio.Scanner 來捕捉輸入

/**
 * @Author : jinchunguang
 * @Date : 19-11-4 上午10:37
 * @Project : tcp-chat
 */
package main

import (
    "bufio"
    "fmt"
    "os"
)



func main() {

    scanner := bufio.NewScanner(os.Stdin)

    fmt.Println("請輸入用戶名:")
    scanner.Scan()
    username := scanner.Text()
    if err := scanner.Err(); err != nil {
        fmt.Fprintln(os.Stderr, "reading standard input:", err)
    }

    fmt.Println("請輸入密碼:")
    scanner.Scan()
    password := scanner.Text()
    if err := scanner.Err(); err != nil {
        fmt.Fprintln(os.Stderr, "reading standard input:", err)
    }

    fmt.Println("請輸入主機地址:")
    scanner.Scan()
    host := scanner.Text()
    if err := scanner.Err(); err != nil {
        fmt.Fprintln(os.Stderr, "reading standard input:", err)
    }

    fmt.Println("請輸入用端口:")
    scanner.Scan()
    port := scanner.Text()
    if err := scanner.Err(); err != nil {
        fmt.Fprintln(os.Stderr, "reading standard input:", err)
    }

    fmt.Printf("參數值:username=%v password=%v host=%v port=%v ", username, password, host, port)

  
}

示例
[圖片上傳失敗...(image-d15dd0-1572847112810)]

bufio.NewReader 來捕捉輸入

/**
 * @Author : jinchunguang
 * @Date : 19-11-4 上午10:37
 * @Project : tcp-chat
 */
package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func main() {

    text:=""
    reader := bufio.NewReader(os.Stdin)

    fmt.Println("請輸入用戶名")
    text, _ = reader.ReadString('\n')
    // 替換掉回車,否則會有空行
    username := strings.Replace(text, "\n", "", -1)

    fmt.Println("請輸入密碼")
    text, _ = reader.ReadString('\n')
    // 替換掉回車,否則會有空行
    password := strings.Replace(text, "\n", "", -1)

    fmt.Println("請輸入主機地址")
    text, _ = reader.ReadString('\n')
    // 替換掉回車,否則會有空行
    host := strings.Replace(text, "\n", "", -1)

    fmt.Println("請輸入端口號")
    text, _ = reader.ReadString('\n')
    // 替換掉回車,否則會有空行
    port := strings.Replace(text, "\n", "", -1)
    
    fmt.Printf("參數值:username=%v password=%v host=%v port=%v ", username, password, host, port)

}

示例


image.png

由于時間問題,先寫到這吧

本文來自:簡書

感謝作者:aside section._1OhGeD

查看原文:golang 命令行開發基礎

入群交流(和以上內容無關):Go中文網 QQ 交流群:729884609 或加微信入微信群:274768166 備注:入群;關注公眾號:Go語言中文網

149 次點擊  
加入收藏 微博
添加一條新回復 (您需要 登錄 后才能回復 沒有賬號 ?)
  • 請盡量讓自己的回復能夠對別人有幫助
  • 支持 Markdown 格式, **粗體**、~~刪除線~~、`單行代碼`
  • 支持 @ 本站用戶;支持表情(輸入 : 提示),見 Emoji cheat sheet
  • 圖片支持拖拽、截圖粘貼等方式上傳