首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Go Lang -如何在Go中构建命令行菜单

在Go语言中构建命令行菜单,通常涉及到标准输入输出的处理以及基本的控制流程。下面是一个简单的示例,展示如何创建一个基本的命令行菜单:

代码语言:txt
复制
package main

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

func main() {
    menu := `
    请选择一个选项:
    1. 选项一
    2. 选项二
    3. 退出
    `

    for {
        fmt.Print(menu)
        reader := bufio.NewReader(os.Stdin)
        input, _ := reader.ReadString('\n')
        input = strings.TrimSpace(input)
        switch input {
        case "1":
            fmt.Println("你选择了选项一")
        case "2":
            fmt.Println("你选择了选项二")
        case "3":
            fmt.Println("退出程序")
            return
        default:
            fmt.Println("无效的选项,请重新输入")
        }
    }
}

基础概念

  • bufio.NewReader: 用于从标准输入读取数据。
  • os.Stdin: 标准输入流。
  • strings.TrimSpace: 移除字符串首尾的空白字符。
  • switch语句: 根据不同的条件执行不同的代码块。

优势

  • 简单直观: Go语言的标准库提供了足够的功能来处理命令行输入输出,使得构建命令行菜单变得简单。
  • 跨平台: Go语言编译后的程序是跨平台的,可以在不同的操作系统上运行。
  • 性能: Go语言的性能接近C/C++,适合需要高性能的应用场景。

类型

  • 文本菜单: 如上例所示,通过文本展示菜单选项。
  • 图形菜单: 使用第三方库如github.com/gizak/termui可以创建图形界面的菜单。

应用场景

  • CLI工具: 命令行界面工具,如文件管理器、配置工具等。
  • 自动化脚本: 需要用户交互的自动化脚本。
  • 系统管理工具: 如服务器监控、日志分析等。

可能遇到的问题及解决方法

  • 输入读取问题: 如果在某些环境下无法正确读取输入,可以尝试使用fmt.Scanln或者检查环境配置。
  • 跨平台兼容性: 确保使用的第三方库支持目标平台,或者自行处理平台差异。
  • 性能问题: 对于复杂的菜单系统,如果性能成为问题,可以考虑优化输入输出处理或者使用并发处理。

参考链接

这个示例提供了一个基本的命令行菜单框架,你可以根据实际需求扩展选项和处理逻辑。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Go通过cobra快速构建命令行应用

来自jetbrains Go 语言现状调查报告 显示:在go开发者中使用go开发实用小程序的比例为31%仅次于web,go得益于跨平台、无依赖的特性,用来编写命令行或系统管理这类小程序非常不错。...本文主要介绍Steve Francia(spf13)大神写的用于快速构建命令行程序的golang包cobra,基于cobra写命令行的著名项目一只手数不过来:Docker CLI、Helm、istio、...---- cobra包提供以下功能: 轻松创建基于子命令的 CLI: app server、 app fetch等。...简单的应用从命令行直接写入参数是很常见的,但是如果比较复杂的命令行应用参数需要非常多,再这样操作不太合理,cobra作者还写了另一个在go很流行的包viper用于解析配置文件,比如kubectl 的yml...本文涉及代码已提交至仓库code/xpower cobra包含很多开箱即用的功能,经过大量项目验证和完善,已满足大部分命令行应用构建需求。

47510

大道青天,协程来通信,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang通道channel的使用EP14

图片     众所周知,Go lang的作用域相对严格,数据之间的通信往往要依靠参数的传递,但如果想在多个协程任务中间做数据通信,就需要通道(channel)的参与,我们可以把数据封装成一个对象,...即当有协程对通道进行操作的时候,其他协程都处于“等待”状态,说白了,就是在“排队”,在之前的一篇:并发与并行,同步和异步,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang并发编程之GoroutineEP13...select关键字     select 是 Go lang里面的一个流程控制结构,和switch关键字差不多,但是select会随机执行一个可运行的通道通信,如果没有通道通信可运行,它将阻塞,直到有通道通信可运行.../wodfan/work/mydemo/hello.go" ch1取数据。。...200 ➜ mydemo git:(master) ✗ go run "/Users/liuyue/wodfan/work/mydemo/hello.go" ch1取数据。。

19520
  • Go实战 | 让flag支持从文件读取命令行参数

    golang标准库提供了flag包来处理命令行参数。常规的使用都是在命令行启动服务的时候一一的输入,让程序解析。今天给大家介绍一种可以从文件读取命令行参数的实现方法。...参数,如下: go run main.go -redis_address=redisaddr.goxuetang.com 随着项目规模的增大,需要的命令行参数越来越多,假设有50个命令行参数甚至更多,如果我们一个一个指定的话...下面我们就介绍通过让程序从配置文件读取的方法。 02 通过文件读取命令行参数的flag应用 常规应用,我们看到,读取并解析命令行参数的逻辑主要在flag.Parse。...run main.go -flagfile=/data/conf/prod.gflags 04 总结 和常规的flag应用相比,将命令行参数写在配置文件,可以提高命令行参数的可读性以及可维护性。...该方法的实现思路主要是应用了flag.Parse解析命令行参数底层的CommandLine.Parse(arguments []string)的函数功能,将文件的每行命令行参数组织成一个切片,然后调用

    1.2K20

    Go 构建一个区块链 -- Part 3: 持久化和命令行接口

    ---- 引言 到目前为止,我们已经构建了一个有工作量证明机制的区块链。有了工作量证明,挖矿也就有了着落。虽然目前的实现离一个有着完整功能的区块链越来越近了,但是它仍然缺少了一些重要的特性。...在今天的内容,我们会将区块链持久化到一个数据库,然后会提供一个简单的命令行接口,用来完成一些与区块链的交互操作。...之所以选择使用 encoding/gob, 是因为它很简单,而且是 Go 标准库的一部分。 数据库结构 在开始实现持久化的逻辑之前,我们首先需要决定到底要如何在数据库中进行存储。...在获得一个 tip (可以是链的任意一个块)之后,我们就可以重新构造整条链,找到它的长度和需要构建它的工作。这同样也意味着,一个 tip 也就是区块链的一种标识符。...现在我们想要拥有这些命令: blockchain_go addblock "Pay 0.031337 for a coffee" blockchain_go printchain 所有命令行相关的操作都会通过

    45020

    使用PostgreSQL和Gemini在Go为表格数据构建RAG

    它演示了一个使用 Go 构建的检索增强生成 (RAG) 系统,该系统利用 PostgreSQL 和 pgvector 进行数据存储和检索。提供的代码展示了核心功能。...在本文中,我们将探讨 Gemini(Google 开发的多模态大型语言模型)与 PostgreSQL 的可能集成,以及如何构建检索增强生成 (RAG) 系统以在结构化数据中导航。...在 RAG ,我们有三个组件: 侦探:这是一个生成模型, Gemini,它利用其知识来回答你的问题或完成任务。...在深入了解 Go 代码之前,我们必须设计数据库数据的结构。 最简单的解决方案是创建一个表,其中包含我们的 LLM 将生成的文本报告及其“紧凑表示”(嵌入)在一起。...生成报告 在 Go ,我们可以利用 embed 包直接在二进制文件嵌入文件。

    20410

    Go语言精进之路】构建高效Go程序:掌握变量、常量声明法则与iota在枚举的奥秘

    Go语言体系,变量是存储数据的基本单元,其核心功能在于保存程序运行过程的信息。...这意味着: 类型固定性:一旦为变量指定了一个类型,int或string,该变量就只能存储该类型的数据,无法在程序运行过程改变其类型。...Go会自动为这些变量赋予其类型的零值(int的零值为0,bool为false等)。...但在同一个const块,即使中间插入了其他非常量声明(变量声明或函数声明),iota的递增也会继续。...常量的演变与优化 从C语言常量设计的回顾到Go语言的改进,突出了Go在常量系统上的进步,类型安全、强大的编译时计算能力、以及通过iota实现的枚举简化。

    12010

    从编译器角度出发探索如何在go实现AOP

    appended to xtop.// Returns the total count of parsed lines.func parseFiles(filenames []string) uint {...}注释所说这里会用多个...goroutine来解析文件,最终这个parseFiles函数会将整个文件对应的语法树存到src/compile/internal/gc/noder.go的noder结构体,一个 noder 对象相当于...会在主程序入口文件调用gc.Main函数,也就是go build的主要构建过程,gc.Main中会调用cmd/compile/internal/gc.parseFiles方法来实现词法分析和语法分析。...编译器词法分析和语法分析之后,实现aop的方案是显而易见的,我们可以在cmd/compile/internal/gc.parseFiles函数构建ast的时候,对已经构造好的ast树进行修改,因为go已经有通过实现接口...、返回值等信息的切面代码通过改写ast的构建织入业务的代码,只要构建成功之后就可以将录制的流量输出到我们的存储介质给解析模块用。

    1.4K30

    Go语言中的交互式CLI开发:survey库简介

    构建命令行工具时,良好的用户交互体验至关重要。尤其是在需要与用户进行复杂输入的场景下,传统的命令行参数和标志可能显得笨拙。...github.com/AlecAivazis/survey/v2 是一个为 Go 语言设计的库,专门用于构建交互式的命令行界面。它提供了多种用户输入方式,让你的 CLI 工具变得更加易用和友好。...survey 是一个 Go 库,旨在通过交互式提示收集用户输入。它提供了一组丰富的提示类型,包括文本输入、选择菜单、确认提示、多项选择等,极大地方便了开发者在命令行工具实现用户交互。...\n", name)}在这个例子,survey.Input 创建了一个文本输入提示,用户的输入将存储在 name 变量。2. 选择菜单有时候我们需要用户从一组选项中选择一个。...\n", name, age) },}func main() { rootCmd.Execute()}这个例子展示了如何在 Cobra 命令嵌入 survey,为用户提供交互式体验。

    10910

    DDD 在 Go 的落地 | 如何在业务中使用领域事件?

    作者 | 于振 责编 | 韩楠 朋友,你好,今天我想与你聊聊如何在业务中正确使用领域事件,通过前面几篇文章的分享,相信你对 DDD 在 Go 如何落地已经有了一定的了解。...同时,也可以看到,参与到整个事件通知过程的,除了事件的发布者和事件本身,还需要有事件的订阅者,这有点类似于设计模式的观察者模式。...主要原因在于Go语言的特性,这是一种妥协的写法。 对于事件来说,我们大概率是需要将其序列化为json字符串,然后通过消息队列广播出去的。...例如,在一个 ProductInventoryChanged 事件,就应该同时包含变更之前的状态和变更之后的状态: 适当的上下文,有助于消费者构建成一个自治的系统。...在 Java 里,静态方法可以直接通过类来访问,比如: 在 Go 里虽然没有静态方法,但是我们可以通过 var eventPublisher EventPublisher 的形式,来模拟类似静态方法的调用形式

    1.6K30

    何在 Go 函数获取调用者的函数名、文件名、行号...

    背景 我们在应用程序的代码添加业务日志的时候,不论是什么级别的日志,除了我们主动传给 Logger 让它记录的信息外,这行日志是由哪个函数打印的、所在的位置也是非常重要的信息,不然排查问题的时候很有可能就犹如大海捞针...logger.Info("hello world") } 输出: {"level":"info","ts":1587740198.9508286,"caller":"caller/main.go...如果让我们用 Go 设计一个Log Facade,就需要我们自己在门面里获取调用者的函数名、文件位置了,那么在Go里面怎么实现这个功能呢?...CallerA函数的调用者的调用栈 pc1, file1, lineNo1, ok1 := runtime.Caller(1) } 函数的返回值为调用栈标识符、带路径的完整文件名、该调用在文件的行号...真正要实现日志门面之类的类库的时候,可能是会有几层封装,想在日志里记录的调用者信息应该是业务代码打日志的位置,这时要向上回溯的层数肯定就不是 1 这么简单了,具体跳过几层要看实现的日志门面具体的封装情况

    6.5K20

    Go 每日一库之 cli

    简介 cli是一个用于构建命令行程序的库。我们之前也介绍过一个用于构建命令行程序的库cobra。在功能上来说两者差不多,cobra的优势是提供了一个脚手架,方便开发。...Name和Usage都显示在帮助,Action是调用该命令行程序时实际执行的函数,需要的信息可以从参数cli.Context获取。...= nil { log.Fatal(err) } } 这里只是简单输出: $ go run main.go hello world 1: hello 2: world 选项 一个好用的命令行程序怎么会少了选项呢...= nil { log.Fatal(err) } } 上面是一个打招呼的命令行程序,可通过选项lang指定语言,默认为英语。设置选项为非english的值,使用汉语。.../aliase -l chinese --lang chinese Cannot use two forms of the same flag: l lang 环境变量 除了通过执行程序时手动指定命令行选项

    1.5K30

    何在 Go 优雅的处理和返回错误(1)——函数内部的错误处理

    = nil { return err } 这种方法有值得商榷的点: 虽然符合 Go 的代码规范,但是在实操,if 语句中的花括号不换行这一点还是非常有争议的,并且笔者在实际代码也很少见到过 代码不够直观...,大致浏览代码的时候,断言代码不显眼,而且在花括号除了 return 之外也没法别的了,原因是 Go 的规范强烈不建议使用 ; 来分隔多条语句(if 条件判断除外) 因此,笔者强烈不建议这么做。...对于 Go 来说,非常热门的单元测试框架 goconvey 就是使用 panic 机制来实现单元测试的断言,用的人都说好。...---   下一篇文章是《如何在 Go 优雅的处理和返回错误(2)——函数/模块的错误信息返回》,笔者详细整理了 Go 1.13 之后的 error wrapping 功能,敬请期待~~ --- 本文章采用...原文标题:《如何在 Go 优雅的处理和返回错误(1)——函数内部的错误处理》 发布日期:2021-09-18 原文链接:https://cloud.tencent.com/developer/article

    9.1K151

    何在Ubuntu上安装和配置GoCD

    在本教程,我们将演示如何在Ubuntu 16.04上设置GoCD服务器。我们将使用项目提供的软件包安装服务器和代理以完成CI/CD工作。...我们应该使用我们之前使用htpasswd创建的密码文件来启用身份验证,单击顶部导航菜单的ADMIN,然后在Security子菜单中选择Authorization Configuration: 在随后的页面上...重新登录Web界面后,单击顶部菜单的ADMIN,然后从下拉菜单中选择Server Configuration: 您将进入主配置页面,我们可以在其中调整一些设置。...单击顶部菜单的AGENTS项。您将被带到代理商列表: 我们启动的代理进程已成功注册到服务器,其状态设置为“空闲”。...结论 在本教程,我们已经安装并配置了在Ubuntu上运行的GoCD服务器和代理。我们在单独的分区上设置专用工件存储空间,以处理生成的构建,并配置身份验证以保护Web界面。

    1.4K40

    兔起鹘落全端涵盖,Go lang1.18入门精炼教程,由白丁入鸿儒,全平台(Sublime 4)Go lang开发环境搭建EP00

    在打开的系统信息界面,选择左侧菜单的“高级系统设置”。随后在打开的“系统属性”窗口选择下方的“环境变量”选项。...最后在打开的环境变量,检查系统是否将Go lang的安装目录"c:/go/bin"配置到了环境变量里,如果已经配置了,在终端中键入命令: go version     系统返回: C:\Users\liuyue...>go version go version go1.18.5 windows/amd64     说明Go lang1.18版本已经在系统安装成功。    ...如果我们不希望go lang在系统留下些许的痕迹,Docker也可以帮我们快速搭建开发环境,关于Docker的安装,请移玉步至:一寸宕机一寸血,十万容器十万兵|Win10/Mac系统下基于Kubernetes...,官方推荐使用,有了它就不再受GOPATH的限制,可以在任何目录初始化项目,打开命令行,键入命令: go env -w GO111MODULE=auto go env -w GOPROXY=https:

    57730

    使用 Go + HTML + CSS + JS 构建漂亮的跨平台桌面应用

    您可以使用 Go 的灵活性和强大功能,结合丰富的现代前端,轻松的构建应用程序。它支持如下功能: 1. 原生菜单、对话框、主题和半透明;Windows、macOS 和 linux 支持 2....可以轻松创建、构建和打包应用的强大命令行工具 8. 丰富的 运行时库 9....它不仅看起来很强,它使用原生菜单和半透明 - 你希望从现代原生应用得到的一切 Wails 带有许多预配置的模板,可让您快速启动和运行应用程序。...Wails 使用专门构建的库来处理窗口、菜单、对话框等原生元素,因此您可以构建美观、功能丰富的桌面应用程序。 它不嵌入浏览器,因此性能高。相反,它使用平台的原生渲染引擎。...它将检测您的 Go 代码的任何更改并自动重新构建和重新启动您的应用程序。

    6.9K10

    Viper: 灵活的Go配置库

    大家好,我是你的Go开发技术博主。今天我们将一起探讨一个在Go社区非常热门的库——Viper。在任何大型的应用,无论是前端还是后端,配置都是必不可少的一部分。...Viper支持许多种类的配置源和格式,比如环境变量、命令行参数、JSON、TOML、YAML、HCL,甚至还包括远程配置系统etcd或Consul。...本篇博文将全面地探讨Viper,并带你了解如何在你的Go应用程序中使用它。尤其是我们将深入探讨一个特殊的知识点——直接从字符串解析配置,这种情况下,字符的内容是YAML文本。 1....它支持多种配置格式,可以从各种来源读取配置,文件、环境变量、命令行参数,甚至远程配置系统。...其中一些项目包括:Hugo,一个用于构建网站的静态网站生成器;Cobra,一个用于构建现代Go CLI交互的命令行库;Viper,一个用于Go应用程序的配置库;

    62620
    领券