命令行程序如何同时支持参数调用和管道输入两种运行模式?
实现思路
要同时兼容两种调用模式,只需要按以下优先级判断输入来源即可:
- 优先检查命令行参数
os.Args的长度:如果参数数量大于1(第一个参数是程序本身路径),说明用户是通过传参的方式调用,直接处理传入的字符串即可 - 如果没有传入额外参数,再通过
bufio.NewScanner(os.Stdin)读取标准输入内容,处理管道传入的数据
Go 实现示例代码
package main import ( "bufio" "fmt" "os" "strings" ) func main() { // 优先处理命令行传参的情况 if len(os.Args) > 1 { input := strings.Join(os.Args[1:], " ") fmt.Println(strings.ToUpper(input)) return } // 没有传参则读取标准输入(管道场景) scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { line := scanner.Text() fmt.Println(strings.ToUpper(line)) } if err := scanner.Err(); err != nil { fmt.Fprintf(os.Stderr, "读取输入失败: %v\n", err) os.Exit(1) } }
效果验证
编译后执行两种调用方式均可正常工作:
- 直接传参调用
> uppercase "willy wonka" WILLY WONKA
- 管道输入调用
> cat names.txt | uppercase CHARLIE VIOLET MIKE
内容的提问来源于stack exchange,提问作者GreenTriangle
相关产品推荐
相关产品推荐

