GO终端读取

2023-11-12

GO终端读取

Go语言获取标准输入

Go语言 fmt 包下有 fmt.Scan、fmt.Scanf、fmt.Scanln 三个函数,可以在程序运行过程中获取用户输入。

func Scan(a …interface{}) (n int, err error)

Scan从标准输入扫描文本,将成功读取的空白分隔的值保存进成功传递给本函数的参数。换行视为空白。返回成功扫描的条目个数和遇到的任何错误。如果读取的条目比提供的参数少,会返回一个错误报告原因。

func Scanf(format string, a …interface{}) (n int, err error)

Scanf从标准输入扫描文本,根据format 参数指定的格式将成功读取的空白分隔的值保存进成功传递给本函数的参数。返回成功扫描的条目个数和遇到的任何错误。

func Scanln(a …interface{}) (n int, err error)

Scanln类似Scan,但会在换行时才停止扫描。最后一个条目后必须有换行或者到达结束位置。

获取标准输入示例

示例一:Scan 函数应用

package main

import  "fmt"

func  main() {

fmt.Println("Please enter your firstname and lastname ")

var  firstname, lastname  string

fmt.Scan(&firstname, &lastname)

fmt.Println("hello,", firstname, "and", lastname)

}

编译后运行,在窗口中输入:
oldboy golang
输出:
hello, oldboy and golang
可以看出,go把输入的参数按空格分开后,分别赋值给了 firstname 和 lastname 。
整体运行结果(第二行是运行时用户输入的):
Please enter your firstname and lastname
oldboy golang
hello, oldboy and golang
再次运行,这次我们输入时换行输入:
Please enter your firstname and lastname
oldboy
golang
hello, oldboy and golang
在第二行、第三行 oldboy 和 golang 中间是敲了回车的,这是Scan和Scanln的区别。Scanln只要收到回车就不会继续接收输入了。

示例二:Scanf 函数应用

package main

import  "fmt"

func  main() {

fmt.Println("Please enter your names ")

var  firstname, lastname  string

fmt.Scanf("%s , %s", &firstname, &lastname)

fmt.Println("hello,", firstname, "and", lastname)

}

编译运行:
Please enter your firstname and lastname
oldboy , golang
hello, oldboy and golang
注意:
1、Scanf中间有一个逗号(,)逗号和%s间有空格,因为Scanf是用空格来区分不同的参数的。
2、输入的参数gates , jobs 格式与 Scanf 中指定的 fmt 要一致。
3、中间的逗号(,)Scanf会自动格式匹配不会添加到变量中。

示例三:Scanln 函数应用

package main

import  "fmt"

func  main() {

fmt.Println("Please enter your names ")

var  firstname, lastname  string

fmt.Scanln(&firstname, &lastname)

fmt.Println("hello,", firstname, "and", lastname)

}

编译运行:
Please enter your firstname and lastname
oldboy golang
hello, oldboy and golang
Scanln和Scan非常类似,只是Scanln只会接受一个回车,收到回车就扫描结束了。

其它类似函数
func Fscan(r io.Reader, a …interface{}) (n int, err error)
func Fscanln(r io.Reader, a …interface{}) (n int, err error)
func Fscanf(r io.Reader, format string, a …interface{}) (n int, err error)

功能同 fmt.Scan、fmt.Scanf、fmt.Scanln 三个函数,只不过从 r 中读取数据。
func Sscan(str string, a …interface{}) (n int, err error)
func Sscanln(str string, a …interface{}) (n int, err error)
func Sscanf(str string, format string, a …interface{}) (n int, err error)

功能同 fmt.Scan、fmt.Scanf、fmt.Scanln 三个函数,只不过从 str 中读取数据。

Go语言获取命令行参数

os.Args
os包提供一些函数和变量。
变量os.Args是一个字符串slice。可以理解它是一个动态容量的顺序数组s,可以通过s[i]来访问单个元素,通过s[m:n]来访问一段连续子区间,数组长度用len(s)表示。
在Go语言中,所有的索引使用半开区间,即包含第一个索引,不包含最后一个索引。
os.Args的第一个元素是os.Args[0],它是命令本身的名字;另外的元素是程序开始执行时的参数。表达式s[m:n]表示一个从第m个到第n-1个元素的slice。

package main

import (
    "fmt"
    "os"
    "strconv"
)

func main() {
    for k, v := range os.Args {
        fmt.Println("参数"+strconv.Itoa(k)+":", v)
    }
}

编译并运行,在窗口中输入:
go build main.go

./main -u oldboy -p 123456
运行结果:
参数0: ./main
参数1: -u
参数2: oldboy
参数3: -p
参数4: 123456
可以看到,命令行参数包括了程序路径本身,以及通常意义上的参数。
程序中os.Args的类型是 []string ,也就是字符串切片。所以可以在for循环的range中遍历,还可以用 len(os.Args) 来获取其数量。

flag包

Go 提供了一个 flag 包,支持基本的命令行标志解析。flag包相比单纯的通过os.Args切片分析命令行参数,提供了更强的能力,同时也是复杂的用法。

命令行解析常用函数和方法:
func Parse()

从os.Args[1:]中解析注册的flag。必须在所有flag都注册好而未访问其值时执行。未注册却使用flag -help时,会返回ErrHelp。
func Int(name string, value int, usage string) *int

Int用指定的名称、默认值、使用信息注册一个int类型flag。返回一个保存了该flag的值的指针。
func Bool(name string, value bool, usage string) *bool

Bool用指定的名称、默认值、使用信息注册一个bool类型flag。返回一个保存了该flag的值的指针。
func String(name string, value string, usage string) *string

String用指定的名称、默认值、使用信息注册一个string类型flag。返回一个保存了该flag的值的指针。
func Args() []string

返回解析之后剩下的非flag参数。(不包括命令名)
func (f *FlagSet) StringVar(p *string, name string, value string, usage string)

StringVar用指定的名称、默认值、使用信息注册一个string类型flag,并将flag的值保存到p指向的变量。
程序示例:

package main

import (
    "flag"
    "fmt"
)

var i = flag.Int("i", 0, "int类型参数")
var b = flag.Bool("b", false, "bool类型参数")
var s = flag.String("s", "", "string类型参数")

func main() {
    flag.Parse()
    fmt.Println("-i:", *i)
    fmt.Println("-b:", *b)
    fmt.Println("-s:", *s)
    fmt.Println("其他参数:", flag.Args())
}

编译并运行,在窗口中输入:
go build main.go

./main -i 100 -b -s string hi golang
运行结果:
-i: 100
-b: true
-s: string
其他参数: [hi golang]

上述代码在 flag.Prase() 之前,定义了 i、b、s 三个接受参数的变量, i、b、s 是指针类型的变量。flag.String() 方法返回的是保存日后解析出来的对应参数的值的位置,是一个已经分配好的空间,我们可以用这个指针变量来接受这个位置。
待程序重新进入main函数,执行flag.Parse()函数之后,这三个位置上就出现了我们命令行传入的参数(其实在程序初始化期就有默认值)。
后续我们可以使用 i、b、*s 来访问具体的内容。

应用示例:

package main

import (
    "flag"
    "fmt"
)

var (
    confPath string = "./oldboy.conf"
    logPath  string = "./oldboy.log"
)

func init() {
    flag.StringVar(&confPath, "conf", "./oldboy.conf", "set config file path")
    flag.StringVar(&logPath, "log", "./oldboy.log", "set log file path")
}

func main() {
    flag.Parse()
    fmt.Println("config path : ", confPath)
    fmt.Println("log path : ", logPath)
}

编译并运行,在窗口中输入:
go build main.go

./main -conf ./oldboy/go.conf -log ./oldboy/go.log
运行结果:
config path : ./oldboy/go.conf
log path : ./oldboy/go.log

注意1:如果你省略一个标志,那么这个标志的值自动的设定为他的默认值。

./main -conf ./oldboy/go.conf

运行结果:
config path : ./oldboy/go.conf
log path : ./oldboy.log

注意2:flag 包需要所有的标志出现位置参数之前(否则,这个标志将会被解析为位置参数)。
./main go -conf ./oldboy/go.conf -log ./oldboy/go.log
运行结果:
config path : ./oldboy.conf
log path : ./oldboy.log

注意3:使用 -h 或者 --help 标志来得到自动生成的这个命令行程序的帮助文本。
./main -h
运行结果:
Usage of ./main:
-conf string
​ set config file path (default “./oldboy.conf”)
-log string
​ set log file path (default “./oldboy.log”)

注意4:如果你提供一个没有使用 flag 包指定的标志,程序会输出一个错误信息,并再次显示帮助文本。
./main -what
运行结果:
flag provided but not defined: -what
Usage of ./main:
-conf string
​ set config file path (default “./oldboy.conf”)
-log string
​ set log file path (default “./oldboy.log”)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GO终端读取 的相关文章

  • 解决qemu虚拟机图形界面卡死问题

    1 基础环境 Virtio gpu双heads 4 9 0内核 xserver1 9 3 modesettings0 5 0驱动 2 问题描述 终端中打开大量文字内容 不停上下滑动 或cat大量内容的文件 操作过程中用户界面卡死 如下 3
  • 华为交换机的基本配置,看完秒懂

    一 交换机的基本配置 交换机连接方式 本地 计算机COM口 USB口 gt Console线 gt 交换机Console口 远程 Putty SecureCRT Xshell远程管理工具 华为VRP网络操作系统 1 华为的视图模式
  • 一文带您了解软件多租户技术架构

    1 多租户技术概述 随着近几年云计算技术的不断发展和成熟 云计算多租户技术在 SaaS 服务领域获得得快速的发展和广泛的应用 基于多租户技术的业务平台首先要保证不同租户业务的隔离 业务隔离主要包括下面 2 个方面 物理隔离 租户开展业务所依
  • 快速玩转 Llama2!机器学习 PAI 最佳实践(二)—全参数微调训练

    前言 近期 Meta 宣布大语言模型 Llama2 开源 包含7B 13B 70B不同尺寸 分别对应70亿 130亿 700亿参数量 并在每个规格下都有专门适配对话场景的优化模型Llama 2 Chat Llama2 可免费用于研究场景和商
  • VMWare虚拟机网络配置

    Bridged 桥接模式 桥接模式相当于虚拟机和主机在同一个真实网段 VMWare充当一个集线器功能 一根网线连到主机相连的路由器上 所以如果电脑换了内网 静态分配的ip要更改 图如下 NAT 网络地址转换模式 NAT模式和桥接模式一样可以
  • 从零开始:在腾讯云轻量服务器上安装Docker,实现快速开发和部署!

    本文指导您如何在 零基础轻量应用服务器上安装 Docker 以及使用 Docker 镜像源加速镜像下载 好了 没有废话 让我们开始行动吧 第一步 购买服务器 小编买的是 腾讯的 1年446RMB 下载链接如下 学生云服务器 学生云主机 学生
  • VM装MACos

    准备工具 下载macOS Ventura 13 ISO镜像文件 VMware Workstation Pro最新版并激活 自行官网下载即可 需要镜像和key可以最下边的云盘自取 下载Unlocker for VMware Workstati
  • 【云知识】云计算平台都有那些,涨涨云概念

    2023年 第36周 给自己一个目标 然后坚持总会有收货 不信你试试 云计算平台是指为企业和个人提供云计算服务的基础架构和环境 它提供了一系列的硬件 软件和网络设施 用于支持应用程序的部署 管理和运行 以及数据的存储 处理和传输 目录 一
  • Serverless 的前世今生

    作者 阿里云用户组 从云计算到 Serverless 架构 大家好 我是阿里云 Serverless 产品经理刘宇 很高兴可以和大家一起探索 Serverless 架构的前世今生 从云计算到云原生再到 Serverless 架构 技术飞速发
  • hive的3种数据存储格式

    hive有textFile SequenceFile RCFile三种文件格式 其中textfile为默认格式 建表时不指定默认为这个格式 导入数据时会直接把数据文件拷贝到hdfs上不进行处理 SequenceFile RCFile格式的表
  • 企业如何实现上云、选云和买云的三步走

    云计算的发展进入稳定期后 客户的关注点已经聚焦到了混合云 从混合云的视角出发来看 公有云厂家的产品已经琳琅满目非常成熟了 从传统的虚拟服务器 存储 网络 到数据库 中间件到 Docker 等 各大主流公有云厂商都推出了具有相当竞争力的产品
  • 从阿里云OSS获取文件,下载打包

    从OSS服务上批量获取文件下载 并打包zip Slf4j Component RefreshScope public class OssBootUtil 初始化 oss 客户端 return private static OSSClient
  • 光环云与亚马逊云科技成功举办“合作伙伴成长峰会:赋能与共赢”活动

    光环云作为由光环新网和西云数据所提供的亚马逊云科技中国区域推广计划的授权增值推广商 致力于帮助中国企业更加方便 高效 安全地享受亚马逊云科技云服务 加速数字化转型 2023年11月29日 光环云携手亚马逊云科技和商礼科技成功举办 合作伙伴成
  • 国外免费VPS真的零成本云计算体验?

    在当今数字化时代 云计算已经成为企业和个人的热门选择之一 云计算提供了便捷 灵活和经济高效的计算资源 可以帮助人们处理数据 托管网站 运行应用程序等等 然而 对于一些初学者来说 使用云计算可能会变得有些昂贵 但是 有一种方式可以让您尝试云计
  • AWS向量数据库Amazon OpenSearch Service使用测评

    前言 在大模型盛行的当今 选择适宜的数据库显得尤为重要 因为你需要面对海量训练数据 快速的检索至关紧要 以及对于存储的要求也是至关重要的 对于海量的数据查询和存储是需要巨大的算力支持 向量数据库常用在一些图像文本或者视频的生成中进行训练 快
  • AWS-WAF-CDN基于速率rate的永久黑名单方案(基于lambda实现)

    参考方案 有坑 所以产生了这篇博客 点击跳转 1 部署waf 有则跳过 必须存在一个rate速率规则 后面的方案堆栈要用 新建rate速率规则 关联cdn资源 2 部署堆栈 美国东部 弗吉尼亚北部 us east 1 1 堆栈文件获取方式
  • 阿里云一二级域名配置

    一级域名配置 二级域名配置
  • 阿里云服务器地域怎么选择?哪个地域好?

    阿里云服务器地域和可用区怎么选择 地域是指云服务器所在物理数据中心的位置 地域选择就近选择 访客距离地域所在城市越近网络延迟越低 速度就越快 可用区是指同一个地域下 网络和电力相互独立的区域 可用区之间可以做到故障隔离 将应用部署到不同可用
  • 实实在在万事达!实在智能助力山东万事达集团加速数智化转型

    近日 杭州实在智能科技有限公司 以下简称 实在智能 与山东建筑钢市场 领头羊 山东万事达控股有限公司 以下简称 万事达集团 召开 RPA 机器人流程自动化 项目启动会 实在智能携手万事达集团 联合共建财务RPA一体化研发管理项目 以下简称
  • 8大数字技术打造ESG发展新范式!工业“双碳”建设应该这么做

    随着国家 双碳 目标的提出 数字化 绿色化证进入历史交汇 协同发展 路径合一 相辅相成的重要阶段 在此背景下 中国信通院 中国航天航空 工业互联网产业联盟于2022年联合出版了 数字技术赋能工业碳达峰碳中和应用指南 以下简称 指南 今年又细

随机推荐

  • 最近大火的「元宇宙」是什么?

    公众号后台回复 图书 了解更多号主新书内容 作者 腾讯技术工程特约撰稿人 李佳华 本文将介绍元宇宙的由来和底层技术 探讨海内外资本在这条赛道上的布局 元宇宙将会对哪些行业产生变革的影响 这些影响背后凸显了元宇宙的哪些价值 以及元宇宙逐步实现
  • openwrt reboot流程

    openwrt 系统中 当执行了 reboot 命令 系统将会发生什么事情呢 如何进行重启的呢 下面来一起看一下 reboot 应用层操作 首先 reboot 是由busybox 它是一个集成了常用Linux命令和工具的软件 提供的一个Li
  • leetcode算法面试题:串联所有单词的子串问题、单词拆分问题

    串联所有单词的子串问题 给定一个字符串 s 和一些 长度相同 的单词 words 找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置 注意子串要与 words 中的单词完全匹配 中间不能有其他字符 但不需要考虑 word
  • 数据挖掘算法基础-关联规则

    数据挖掘中 被常拿来说的啤酒尿布的例子就是一个很典型的运用关联算法来做购物来分析的例子 常被用于交易数据 关系数据的分析 发现数据集中隐藏的频繁模式 这些频繁模式可以用关联规则的形式表示 有效的关联规则对商家的商品进出货摆放都有很大的指导意
  • 直方图均衡化与直方图规定化

    一 认识图像 当我们面对图像的时候 我们面对的是抽象的矩阵 如下图 下面是0 255的灰度图像的表示 密密麻麻的 那么我们做的直方图 其实就是对这些像素值的统计 如下图所示 其中Bin表示条数 数据和范围是对图的解释 二 为什么要做直方图均
  • qt 嵌入web页面_Qt -在应用程序中嵌入Web内容之环境搭建

    一 Qt应用程序与Web结合的发展 1 从Qt5 5开始 Qt WebKit模块被废弃了 取而代之的是Qt WebEngine模块 当时可以使用该模块将应用程序与Web技术结合 2 Qt WebEngine模块提供了一个Web浏览器引擎 可
  • ChatGPT:概述Vue.js中data函数初始化和created钩子函数调用的顺序和问题解决方法

    ChatGPT 概述Vue js中data函数初始化和created钩子函数调用的顺序和问题解决方法 我将输入一段Vue代码 请你记住 created console log this queryInfo this getClueList
  • Libuv源码分析 —— 6. 事件循环【uv_run】

    通过之前的学习 咱们已经明白了在事件循环中的三个核心内容 分别是 Libuv源码分析 定时器 Libuv源码分析 idle prepare check Libuv源码分析 poll io 现在让咱们从头捋一遍事件循环到底完成了什么功能呢 u
  • scrapy里面的response.xpath(“用xpath插件找打的路径“)返回值为空?

    response xpath 用xpath插件找打的路径 返回值为空 1 可能是因为路径是有问题的 2 可能是start urls的路径是有问题的 可以从network中找找路径 复制一下
  • 使用vant2问题整理

    1 export createVNode imported as createVNode was not found in vue possible exports EffectScope computed customRef defaul
  • C++11移动语义解析

    当给函数传递对象当做函数参数时 可以使用引用类型来减少拷贝对象的代价 尤其是避免容器的拷贝等 但是当把函数内的局部对象当做返回值时 我们无法返回该局部对象的引用 导致每次返回局部对象都会进行拷贝 因为返回局部对象的引用是无意义的 当函数调用
  • 编译原理实验日志

    编译原理 生成四元式 实验原理 构造SLR 1 分析表 调试过程 实验原理 构造SLR 1 分析表 首先求得follow集 follow E follow T follow F 画出DFA状态转换图 调试过程 没有判断 因为字符串中没有表示
  • dubbo优雅停机

    dubbo优雅停机 Dubbo是通过JDK的ShutdownHook来完成优雅停机的 所以如果用户使用 kill 9 PID 等强制关闭指令 是不会执行优雅停机的 只有通过 kill PID 时 才会执行 原理 服务提供方 停止时 先标记为
  • grafana与prometheus实现监控可视化

    1 Grafana基础知识 Grafana是一个开源的指标监测和可视化工具 官方网站为 Grafana The open observability platform Grafana Labs 常用于展示基础设施的时序数据和应用程序运行分析
  • 大话设计模式9—观察者模式(通知者与观察者)

    大话设计模式9 观察者模式 老板回来 我不知道 1 需求 老板回来 我不知道 2 双向耦合的设计 2 1 前台秘书类 2 2 看股票同事类 2 3main函数及输出 3 解耦修改 3 1 抽象观察者类 3 2 前台秘书类 3 3 main函
  • Java编程中出现乱码的原因

    乱码的原因 理解了编码 我们来看乱码 乱码有两种常见原因 一种比较简单 就是简单的解析错误 另外一种比较复杂 在错误解析的基础上进行了编码转换 我们分别介绍 1 解析错误 看个简单的例子 一个法国人采用Windows 1252编码写了个文件
  • Windows/PC(win + R) 电脑常见操作命令50条

    摘要 win R 1 cmd 打开终端 2 gpedit msc 本地组策略编辑器 3 Nslookup IP地址侦测器 4 explorer 文件资源管理器 5 notepad 系统默认记事本 6 cleanmgr 磁盘清理 7 serv
  • 微信公众号运营错误的四个方式

    1 很多广告宣传 很多的微信公众平台注册便是为了更好地宣传策划商品 在开展內容輸出的情况下 沒有立在客户的视角开展內容輸出 消息推送的內容可能是七拼八凑 与微信公众号的精准定位偏移很远 要想取得成功的运营公众号 最先要做的便是深层次发掘总体
  • vue3 + vite 在线预览docx, pdf, pptx(内外网)并实现移动端适配

    一 内网 1 docx 使用docx preview 安装插件 npm i docx preview S 引入依赖 docx import renderAsync from docx preview let docx import meta
  • GO终端读取

    GO终端读取 Go语言获取标准输入 Go语言 fmt 包下有 fmt Scan fmt Scanf fmt Scanln 三个函数 可以在程序运行过程中获取用户输入 func Scan a interface n int err error