当前位置: 首页 > news >正文

Go语言系统编程与命令行工具

Go语言系统编程与命令行工具

一、命令行参数解析

Go语言提供了多个标准库来处理命令行参数,包括flag包和os包。

使用flag包

package main import ( "flag" "fmt" ) func main() { // 定义命令行参数 name := flag.String("name", "Guest", "User name") age := flag.Int("age", 18, "User age") verbose := flag.Bool("verbose", false, "Enable verbose mode") // 解析参数 flag.Parse() fmt.Printf("Name: %s\n", *name) fmt.Printf("Age: %d\n", *age) fmt.Printf("Verbose: %v\n", *verbose) // 解析剩余的非flag参数 fmt.Printf("Args: %v\n", flag.Args()) }

使用pflag包

go get github.com/spf13/pflag
package main import ( "fmt" "github.com/spf13/pflag" ) func main() { name := pflag.StringP("name", "n", "Guest", "User name") age := pflag.IntP("age", "a", 18, "User age") verbose := pflag.BoolP("verbose", "v", false, "Enable verbose mode") pflag.Parse() fmt.Printf("Name: %s\n", *name) fmt.Printf("Age: %d\n", *age) fmt.Printf("Verbose: %v\n", *verbose) }

二、文件操作

文件读写

package main import ( "fmt" "io/ioutil" "os" ) func main() { // 写入文件 err := ioutil.WriteFile("example.txt", []byte("Hello, World!"), 0644) if err != nil { fmt.Printf("Write error: %v\n", err) return } // 读取文件 content, err := ioutil.ReadFile("example.txt") if err != nil { fmt.Printf("Read error: %v\n", err) return } fmt.Printf("File content: %s\n", content) }

文件操作进阶

package main import ( "bufio" "fmt" "os" ) func main() { // 打开文件 file, err := os.OpenFile("example.txt", os.O_RDWR|os.O_CREATE, 0644) if err != nil { fmt.Printf("Open error: %v\n", err) return } defer file.Close() // 写入数据 writer := bufio.NewWriter(file) _, err = writer.WriteString("Hello, Go!\n") if err != nil { fmt.Printf("Write error: %v\n", err) return } writer.Flush() // 读取数据 file.Seek(0, 0) scanner := bufio.NewScanner(file) for scanner.Scan() { fmt.Println(scanner.Text()) } if err := scanner.Err(); err != nil { fmt.Printf("Scan error: %v\n", err) } }

三、进程管理

启动子进程

package main import ( "fmt" "os/exec" ) func main() { // 执行命令 cmd := exec.Command("echo", "Hello, World!") output, err := cmd.CombinedOutput() if err != nil { fmt.Printf("Command error: %v\n", err) return } fmt.Printf("Output: %s\n", output) }

带管道的进程

package main import ( "fmt" "os/exec" "io" ) func main() { // 创建两个命令 cmd1 := exec.Command("echo", "Hello, Go!") cmd2 := exec.Command("tr", "a-z", "A-Z") // 连接管道 pipe, err := cmd1.StdoutPipe() if err != nil { fmt.Printf("Pipe error: %v\n", err) return } cmd2.Stdin = pipe // 启动命令 err = cmd1.Start() if err != nil { fmt.Printf("Start cmd1 error: %v\n", err) return } output, err := cmd2.CombinedOutput() if err != nil { fmt.Printf("Cmd2 error: %v\n", err) return } cmd1.Wait() fmt.Printf("Output: %s\n", output) }

四、信号处理

package main import ( "fmt" "os" "os/signal" "syscall" "time" ) func main() { // 创建信号通道 sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) // 启动业务逻辑 go func() { for { fmt.Println("Working...") time.Sleep(1 * time.Second) } }() // 等待信号 sig := <-sigChan fmt.Printf("\nReceived signal: %v\n", sig) // 清理资源 fmt.Println("Cleaning up...") fmt.Println("Exiting...") }

五、环境变量

package main import ( "fmt" "os" ) func main() { // 获取环境变量 home := os.Getenv("HOME") fmt.Printf("HOME: %s\n", home) // 设置环境变量 err := os.Setenv("MY_APP_ENV", "production") if err != nil { fmt.Printf("Setenv error: %v\n", err) return } // 获取所有环境变量 env := os.Environ() for _, e := range env { fmt.Println(e) } // 检查环境变量是否存在 _, exists := os.LookupEnv("MY_APP_ENV") fmt.Printf("MY_APP_ENV exists: %v\n", exists) }

六、系统信息

package main import ( "fmt" "os" "runtime" ) func main() { // 获取操作系统信息 fmt.Printf("OS: %s\n", runtime.GOOS) fmt.Printf("Arch: %s\n", runtime.GOARCH) fmt.Printf("CPU cores: %d\n", runtime.NumCPU()) // 获取进程信息 fmt.Printf("Process ID: %d\n", os.Getpid()) fmt.Printf("Parent PID: %d\n", os.Getppid()) // 获取当前工作目录 cwd, err := os.Getwd() if err != nil { fmt.Printf("Getwd error: %v\n", err) return } fmt.Printf("Current directory: %s\n", cwd) }

七、命令行工具框架

使用Cobra

go get github.com/spf13/cobra@latest
package main import ( "fmt" "os" "github.com/spf13/cobra" ) func main() { var rootCmd = &cobra.Command{ Use: "myapp", Short: "A simple command line tool", Long: `MyApp is a demonstration of Cobra commands`, Run: func(cmd *cobra.Command, args []string) { fmt.Println("Hello from MyApp!") }, } var echoCmd = &cobra.Command{ Use: "echo [message]", Short: "Echo the message", Args: cobra.MinimumNArgs(1), Run: func(cmd *cobra.Command, args []string) { upper, _ := cmd.Flags().GetBool("upper") message := args[0] if upper { message = strings.ToUpper(message) } fmt.Println(message) }, } echoCmd.Flags().BoolP("upper", "u", false, "Convert to uppercase") rootCmd.AddCommand(echoCmd) if err := rootCmd.Execute(); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } }

八、日志工具

使用logrus

go get github.com/sirupsen/logrus
package main import ( "github.com/sirupsen/logrus" ) func main() { log := logrus.New() // 设置日志级别 log.SetLevel(logrus.DebugLevel) // 设置输出格式 log.SetFormatter(&logrus.JSONFormatter{}) // 不同级别的日志 log.Debug("Debug message") log.Info("Info message") log.Warn("Warn message") log.Error("Error message") // 带字段的日志 log.WithFields(logrus.Fields{ "user": "john", "id": 42, }).Info("User logged in") }

九、配置文件处理

使用toml配置

go get github.com/BurntSushi/toml
package main import ( "fmt" "os" "github.com/BurntSushi/toml" ) type Config struct { Database struct { Host string `toml:"host"` Port int `toml:"port"` Database string `toml:"database"` } `toml:"database"` Server struct { Port int `toml:"port"` } `toml:"server"` } func main() { config := Config{} file, err := os.Open("config.toml") if err != nil { fmt.Printf("Open config error: %v\n", err) return } defer file.Close() _, err = toml.DecodeReader(file, &config) if err != nil { fmt.Printf("Decode error: %v\n", err) return } fmt.Printf("DB Host: %s\n", config.Database.Host) fmt.Printf("DB Port: %d\n", config.Database.Port) }

配置文件示例:

[database] host = "localhost" port = 3306 database = "example_db" [server] port = 8080

十、总结

Go语言提供了丰富的系统编程能力,通过标准库可以轻松实现:

  1. 命令行参数解析:使用flag或pflag包
  2. 文件操作:读写文件、目录操作
  3. 进程管理:启动子进程、管道通信
  4. 信号处理:捕获系统信号
  5. 环境变量:获取和设置环境变量
  6. 系统信息:获取OS、CPU、进程信息
  7. 命令行框架:使用Cobra构建复杂CLI工具
  8. 日志记录:使用logrus等日志库
  9. 配置文件:支持多种配置格式

掌握这些系统编程能力可以帮助你构建强大的命令行工具和系统应用。

http://www.jsqmd.com/news/824464/

相关文章:

  • Synabun:Node.js 高可靠 HTTP 请求策略引擎详解
  • BaklavaJS Vue渲染器深度解析:组件化架构与响应式状态管理
  • 5分钟重塑游戏性能管理:DLSS Swapper带来的工作流革命
  • 3步掌握:如何用HTML转Figma工具实现网页设计稿快速转换
  • 告别意外锁屏!NoSleep:让Windows电脑在你需要时始终保持清醒的智能守护者
  • 嵌入式核心板选型实战:从AI边缘计算到工业控制的应用解析
  • 终极指南:Seal中Kotlin协程上下文组合的实用技巧
  • 用 RSUSR_DBMS_USERS 批量维护 AS ABAP 与 DBMS 用户映射的工程化方法
  • 【信息科学与工程学】计算机科学与自动化 第十篇 芯片设计04(5)
  • 嵌入式Linux驱动DLP投影:硬件接口、软件栈与实战应用
  • Sora 2直接驱动TikTok爆款生成:2024年首批内测工程师亲授7步提效法,错过再等半年
  • 戴尔笔记本风扇管理终极指南:3种智能模式让散热与静音兼得
  • 你的桌面布局管家:PersistentWindows如何让窗口位置记忆永不丢失
  • 【NotebookLM建筑学研究加速器】:3大隐藏功能让文献综述效率提升300%,92%的高校建筑院系尚未公开使用
  • LetsFG:基于Function与Group的去中心化协作平台设计与实战
  • 数字电路小白也能懂:用Logisim搞定LED计数电路,从真值表到封装测试保姆级教程
  • Acton脚本执行:自动化智能合约操作指南
  • 如何快速上手网易游戏NPK文件解包工具:新手3步完整教程
  • FModel终极指南:免费开源虚幻引擎游戏资源提取工具完全手册
  • 处理器与FPGA异构SoM设计:架构、协同与工程实践
  • 【AI大模型选型指南】《2026年5月(最新版)国内外主流AI大模型选型指南》(个人版)
  • tcpdive传输性能分析完全教程:从基础指标到高级应用
  • 从API密钥管理角度体会Taotoken访问控制的安全性
  • 终极Boot Camp驱动自动化部署方案:Brigadier完全指南
  • 3分钟快速搭建QQ机器人:LuckyLilliaBot OneBot 11终极指南
  • Go语言内存管理与性能优化
  • 零代码也能做游戏?用UE5蓝图系统10分钟做个会转的潜艇(附完整资产包)
  • NotebookLM天文学实战手册(NASA-JPL团队内部验证版):从FAST原始时序数据到可发表图表的端到端工作流
  • BilibiliDown:终极跨平台B站视频下载解决方案
  • 远程工作专注力培养终极指南:10个实用技巧帮你高效工作