Go语言(Golang)编写最简单的命令行工具
最简单的命令行工具
项目预览
>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.mod: module 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
➜
本文来自博客园,作者:寻月隐君,转载请注明原文链接:https://www.cnblogs.com/QiaoPengjun/p/17380380.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
2022-05-07 Go语言学习——函数二 defer语句