golang 命令行开发基础

aside section._1OhGeD · · 616 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

616 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传