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终端读取 的相关文章

  • git切换分支时报错(error: pathspec ‘master‘ did not match any file(s) known to git.)的解决方法

    git切换分支时报错 切换分支 root git my code git checkout master 产生如下报错 error pathspec master did not match any file s known to git
  • openstack开发实践(一):devstack搭建all-in-one的openstack开发环境

    Devstack简介 devstack是面向开发者的一个openstack部署工具 用户可以指定不同的版本分支进行安装 devstack借助于Shell脚本实现openstack自动化部署 devstack源码中的stack sh即为安装脚
  • 华为交换机的基本配置,看完秒懂

    一 交换机的基本配置 交换机连接方式 本地 计算机COM口 USB口 gt Console线 gt 交换机Console口 远程 Putty SecureCRT Xshell远程管理工具 华为VRP网络操作系统 1 华为的视图模式
  • web基础与HTTP协议

    web基础与HTTP 一 web基础 1 DNS与域名 1 1域名 1 2 域名注册 1 3 DNS 解析 1 4 域名 二 网页的概念 1 网页 HTTP HTTPS 2 1网页基本概念 2 2 HTML 概述 2 2 1 HTML超文本
  • 中小企业如何低成本实施MES管理系统

    中小企业在市场竞争中需要有高效的管理体系来支持其运营和发展 中小企业MES管理系统是一种先进的管理系统 可以提升工厂智能化水平 提高生产效率 是中小企业必须采取的有效管理工具 然而 由于资金和技术的限制 中小企业往往难以承担高额的软件购置和
  • 云计算目前国内外发展现状是什么,云计算主要存在哪些问题?

    远在 云计算 的名次出现之前 我国相关科技人员便已对互联网的透明资源储备技术进行了多方面应用 而随着科技的不断进步 对于云计算的应用愈加频繁 政府部门对云计算的建设提供了经济基础与社会软环境的保障 并且在国家科研部门当中设立了专业的部门 直
  • 13 openEuler用户组管理

    文章目录 13 1 创建用户组 13 1 1 groupadd命令 13 1 2 用户组信息文件 13 1 3 创建用户组实例 13 2 修改用户组 13 2 1 修改GID 13 2 2 修改用户组名 13 3 删除用户组 13 4 将用
  • 阿里云Linux热扩容云盘(growpart和resize2fs工具)

    阿里云linux机器系统盘空间不够进行扩容 一 扩容物理盘 阿里云控制台在线扩容完成 二 安装growpart工具和resize2fs工具 root A yum install cloud utils growpart root A yum
  • 快速玩转 Llama2!阿里云机器学习 PAI 推出最佳实践

    前言 近期 Meta 宣布大语言模型 Llama2 开源 包含7B 13B 70B不同尺寸 分别对应70亿 130亿 700亿参数量 并在每个规格下都有专门适配对话场景的优化模型Llama 2 Chat Llama2 可免费用于研究场景和商
  • EI会议——移动互联网、云计算和信息安全国际学术会议

    移动互联网 云计算和信息安全国际学术会议 International Conference on Mobile Internet Cloud Computing and Information Security 火热征稿中 大会官网 htt
  • 汽配企业如何利用MES管理系统优化生产流程

    随着汽车市场个性化需求不断增强 汽配企业急需数字化转型来满足客户需求 如何优化生产流程 提高生产效率和产品质量成为了关键问题 汽配企业MES管理系统可以通过数字化技术和智能化设备 优化生产流程 提高生产效率和产品质量 下面 我们将介绍汽配企
  • 北森,SaaS风口上的「新范式」

    在单纯的战略表象背后 成立19年 北森在每一个节点做选择的核心驱动力是什么 这家公司是否拥有自己内部的 组织密码 作者 皮爷 出品 产业家 2013年 纪伟国决定要去美国 取取经 和他同行的还有参与了北森A轮融资的经纬等机构投资人 对于北森
  • 企业如何实现上云、选云和买云的三步走

    云计算的发展进入稳定期后 客户的关注点已经聚焦到了混合云 从混合云的视角出发来看 公有云厂家的产品已经琳琅满目非常成熟了 从传统的虚拟服务器 存储 网络 到数据库 中间件到 Docker 等 各大主流公有云厂商都推出了具有相当竞争力的产品
  • 【玩转 EdgeOne】| 腾讯云下一代边缘加速CDN EdgeOne 是安全加速界的未来吗?

    目录 前言 边缘加速与安全加固 边缘计算与CDN的融合 EdgeOne优秀的安全特性 EdgeOne卓越的性能表现 灵活的配置和管理 生态系统的支持与发展 技术创新与未来展望 EdgeOne试用 结束语 前言 在当下互联网的迅猛发展的时刻
  • 阿里云添加二级域名

    阿里云添加二级域名 1 申请配置域名 1 1 购买域名 1 2 登录到阿里云服务器控制台 进入云解析DNS页面 1 3 点击 域名解析 1 4 点击 添加记录 1 5 进行txt校验 1 6 添加记录
  • AWS-WAF-CDN基于速率rate的永久黑名单方案(基于lambda实现)

    参考方案 有坑 所以产生了这篇博客 点击跳转 1 部署waf 有则跳过 必须存在一个rate速率规则 后面的方案堆栈要用 新建rate速率规则 关联cdn资源 2 部署堆栈 美国东部 弗吉尼亚北部 us east 1 1 堆栈文件获取方式
  • AWS解决方案架构师学习与备考

    系列文章目录 送书第一期 用户画像 平台构建与业务实践 送书活动之抽奖工具的打造 获取博客评论用户抽取幸运中奖者 送书第二期 Spring Cloud Alibaba核心技术与实战案例 送书第三期 深入浅出Java虚拟机 送书第四期 AI时
  • CloudPulse:一款针对AWS云环境的SSL证书搜索与分析引擎

    关于CloudPulse CloudPulse是一款针对AWS云环境的SSL证书搜索与分析引擎 广大研究人员可以使用该工具简化并增强针对SSL证书数据的检索和分析过程 在网络侦查阶段 我们往往需要收集与目标相关的信息 并为目标创建一个专用文
  • 阿里云服务器地域怎么选择?哪个地域好?

    阿里云服务器地域和可用区怎么选择 地域是指云服务器所在物理数据中心的位置 地域选择就近选择 访客距离地域所在城市越近网络延迟越低 速度就越快 可用区是指同一个地域下 网络和电力相互独立的区域 可用区之间可以做到故障隔离 将应用部署到不同可用
  • 从不同维度的调研数据,看企业数字化转型

    数字化转型逐渐成为企业增长和价值创造的新引擎 然而 在复杂的背景下 企业数字化转型也面临着前所未有的挑战和机遇 未来 我们还能做些什么 怎么做 这成为了各企业高管当前亟需厘清的问题 企业做数字化转型的原因 总体来看 大部分受访企业做数字化转

随机推荐

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

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