Go语言命令行工具开发入门:从 os.Args 到用户输入的实践

109 阅读3分钟

Go语言命令行工具开发入门:从 os.Args 到用户输入的实践

Go语言(Golang)编写最简单的命令行工具

在现代开发中,命令行工具是每个开发者的必备工具,它们不仅能提高工作效率,还能简化一些复杂的操作。在 Go 语言中,编写命令行工具是一个简单且有趣的过程。无论是通过获取命令行参数,还是通过接收用户输入,Go 的标准库都为这些任务提供了强大且简洁的支持。本文将带你从基础开始,逐步深入 Go 语言如何制作命令行工具。

本文将介绍如何使用 Go 语言编写最简单的命令行工具。我们将讨论如何通过 os.Args 获取命令行参数,以及如何通过 bufio.NewReader() 获取用户输入。文章从创建一个基础的命令行工具开始,展示了如何在命令行中处理不同的参数和输入,并逐步优化代码,使之更为简洁。最后,我们还探讨了如何通过模块化和包管理来构建更具扩展性的命令行应用。

项目预览

>echo abc 123 --name=nick
abc 123 --name=nick

课程概述

  • 如何制作命令行应用
  • 如何使用 os.Args 获得命令行参数

前提条件

  • 懂得 Go 语言基本语法

知识点

  • OS 包提供了用于处理操作系统相关内容的函数/值

    • 独立于平台的方式
  • os.Args 变量

    • 获得命令行的参数
    • 它是 string slice
    • 第一个值是命令本身
  • strings.Join 函数

实践

创建项目目录并在该目录下创建 main.go 文件

~/Code/go via 🐹 v1.20.3 via 🅒 base
➜ mcd echo # mkdir echo cd echo

Code/go/echo via 🐹 v1.20.3 via 🅒 base
➜ c # code . 

Code/go/echo via 🐹 v1.20.3 via 🅒 base took 2.4s
➜

main.go 文件

package main

import (
 "fmt"
 "os"
)

func main() {
 var s, sep string
 // os.Args

 for i := 1; i < len(os.Args); i++ {
  s += sep + os.Args[i]
  sep = " "
 }

 fmt.Println(s)
}

运行

Code/go/echo via 🐹 v1.20.3 via 🅒 base 
➜ go build .         

Code/go/echo via 🐹 v1.20.3 via 🅒 base 
➜ ls
echo    main.go

Code/go/echo via 🐹 v1.20.3 via 🅒 base 
➜ echo                                                                    


Code/go/echo via 🐹 v1.20.3 via 🅒 base 
➜ echo 123                                                                
123

Code/go/echo via 🐹 v1.20.3 via 🅒 base 
➜ echo 123 abc ert
123 abc ert

Code/go/echo via 🐹 v1.20.3 via 🅒 base 
➜ 

优化修改一

package main

import (
 "fmt"
 "os"
)

func main() {
 // var s, sep string
 s, sep := """"
 // os.Args

 for _, arg := range os.Args[1:] {
  s += sep + arg
  sep = " "
 }

 // for i := 1; i < len(os.Args); i++ {
 //  s += sep + os.Args[i]
 //  sep = " "
 // }

 fmt.Println(s)
}

运行

Code/go/echo via 🐹 v1.20.3 via 🅒 base 
➜ go build . && echo 123 abc x=123ed
123 abc x=123ed

Code/go/echo via 🐹 v1.20.3 via 🅒 base 
➜ 

优化修改二

package main

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

func main() {
 // var s, sep string
 // s, sep := "", ""
 // os.Args

 // for _, arg := range os.Args[1:] {
 //  s += sep + arg
 //  sep = " "
 // }

 // for i := 1; i < len(os.Args); i++ {
 //  s += sep + os.Args[i]
 //  sep = " "
 // }

 // fmt.Println(s)

 fmt.Println(strings.Join(os.Args[1:], " "))
}

用户输入

  • bufio.NewReader()

实践

~/Code/go via 🐹 v1.20.3 via 🅒 base
➜ mcd cli-demo

Code/go/cli-demo via 🐹 v1.20.3 via 🅒 base
➜ go mod init
go: cannot determine module path for source directory /Users/qiaopengjun/Code/go/cli-demo (outside GOPATH, module path must be specified)

Example usage:
 'go mod init example.com/m' to initialize a v0 or v1 module
 'go mod init example.com/m/v2' to initialize a v2 module

Run 'go help mod init' for more information.

Code/go/cli-demo via 🐹 v1.20.3 via 🅒 base
➜ go mod init cli-demo
go: creating new go.modmodule cli-demo

Code/go/cli-demo via 🐹 v1.20.3 via 🅒 base
➜ c

Code/go/cli-demo via 🐹 v1.20.3 via 🅒 base
➜

main.go 代码

package main

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

func main() {
 fmt.Println("What's your name?")
 reader := bufio.NewReader(os.Stdin)
 text, _ := reader.ReadString('\n')
 fmt.Printf("Your name is: %s", text)
}

运行

Code/go/cli-demo via 🐹 v1.20.3 via 🅒 base took 5.9s 
➜ go run .      
What's your name?
dave
Your name is: dave

Code/go/cli-demo via 🐹 v1.20.3 via 🅒 base took 3.1s 
➜ go run main.go
What's your name?
xiaoqiao
Your name is: xiaoqiao

Code/go/cli-demo via 🐹 v1.20.3 via 🅒 base took 3.1s 
➜ 

总结

在本文中,我们通过一个简单的 Go 语言命令行工具的实现,详细讲解了如何使用 os.Args 来获取命令行参数,如何优化循环结构,如何使用 strings.Join() 进行更简洁的字符串拼接,以及如何使用 bufio.NewReader() 接收用户输入。这些都是构建命令行应用的基础知识。随着对 Go 语言的逐步掌握,你可以利用这些技能扩展出更强大的工具,提升你的开发效率。

🚀 我的个人博客网站正式上线啦!

欢迎大家访问 paxon.fun 🎉

博客名称:Paxon Qiao’s Tech Blog --- 未来我会在这里分享 Web3、区块链、编程等技术文章,敬请期待!🙏

🌐 欢迎访问并留言交流!

本文使用 markdown.com.cn 排版