golang学习笔记 ---命令行参数
os 包以跨平台的方式,提供了一些与操作系统交互的函数和变量。程序的命令行参数可从os
包的Args变量获取;os包外部使用os.Args访问该变量。
os.Args变量是一个字符串(string)的切片(slice)(译注:slice和Python语言中的切片类
似,是一个简版的动态数组),切片是Go语言的基础概念,稍后详细介绍。现在先把切片s当
作数组元素序列, 序列的成长度动态变化, 用 s[i] 访问单个元素,用 s[m:n] 获取子序列(译
注:和python里的语法差不多)。序列的元素数目为len(s)。和大多数编程语言类似,区间索引
时,Go言里也采用左闭右开形式, 即,区间包括第一个索引元素,不包括最后一个, 因为这样
可以简化逻辑。(译注:比如a = [1, 2, 3, 4, 5], a[0:3] = [1, 2, 3],不包含最后一个元素)。比
如s[m:n]这个切片,0 ≤ m ≤ n ≤ len(s),包含n-m个元素。
os.Args的第一个元素,os.Args[0], 是命令本身的名字;其它的元素则是程序启动时传给它的
参数。s[m:n]形式的切片表达式,产生从第m个元素到第n-1个元素的切片
程序用到的参数包含在os.Args[1:len(os.Args)]切片中
示例:
package main import (
"fmt"
"os"
) func main() {
var s, sep string
for i := 1; i < len(os.Args); i++ {
s += sep + os.Args[i]
sep = " "
}
fmt.Println(s)
}
自增语句 i++ 给 i 加1;这和 i += 1 以及 i = i + 1 都是等价的。对应的还有 i-- 给 i 减
1。它们是语句。而不像C系的其它语言那样是表达式。所以 j = i++ 非法,而且++和--都只能放在变量名后面,因此 --i 也非法。
Go语言只有for循环这一种循环语句。for循环有多种形式,其中一种如下所示:
for initialization; condition; post {
// zero or more statements
}
for循环三个部分不需括号包围。大括号强制要求, 左大括号必须和post语句在同一行。
initialization语句是可选的,在循环开始前执行。initalization如果存在,必须是一条简单语句
(simple statement),即,短变量声明、自增语句、赋值语句或函数调用。 condition 是一
个布尔表达式(boolean expression),其值在每次循环迭代开始时计算。如果为 true 则执
行循环体语句。 post 语句在循环体执行结束后执行,之后再次对 conditon 求
值。 condition 值为 false 时,循环结束。
for循环的这三个部分每个都可以省略,如果省略 initialization 和 post ,分号也可以省
略:
// a traditional "while" loop
for condition {
// ...
如果连 condition 也省略了,像下面这样:
// a traditional infinite loop
for {
// ...
}
这就变成一个无限循环,尽管如此,还可以用其他方式终止循环, 如一条 break 或 return 语
句。
for 循环的另一种形式, 在某种数据类型的区间(range)上遍历,如字符串或切
片。
package main
import (
"fmt"
"os"
)
func main() {
s, sep := "", ""
for _, arg := range os.Args[1:] {
s += sep + arg
sep = " "
}
fmt.Println(s)
}
每次循环迭代字符串s的内容都会更新。 += 连接原字符串、空格和下个参数,
产生新字符串, 并把它赋值给 s 。 s 原来的内容已经不再使用,将在适当时机对它进行垃圾
回收。
如果连接涉及的数据量很大,这种方式代价高昂。一种简单且高效的解决方案是使
用 strings 包的 Join 函数
每次循环迭代, range 产生一对值;索引以及在该索引处的元素值。这个例子不需要索引,
但 range 的语法要求, 要处理元素, 必须处理索引。一种思路是把索引赋值给一个临时变量,
如 temp , 然后忽略它的值,但Go语言不允许使用无用的局部变量(local variables),因为这
会导致编译错误。
Go语言中这种情况的解决方法是用 空标识符 (blank identifier),即 _ (也就是下划线)。
空标识符可用于任何语法需要变量名但程序逻辑不需要的时候, 例如, 在循环里,丢弃不需要
的循环索引, 保留元素值。
声明一个变量有好几种方式,下面这些都等价:
s := ""
var s string
var s = ""
var s string = ""
第一种形式,是一条短变量声明,最简洁,但只能用在函数内
部,而不能用于包变量。
第二种形式依赖于字符串的默认初始化零值机制,被初始化为""。
第三种形式用得很少,除非同时声明多个变量。第四种形式显式地标明变量的类型,当变量类
型与初值类型相同时,类型冗余,但如果两者类型不同,变量类型就必须了。实践中一般使
用前两种形式中的某个,初始值重要的话就显式地指定变量的类型,否则使用隐式初始化。
用 strings 包的 Join 函数:
package main import (
"fmt"
"os"
"strings"
) func main() {
fmt.Println(strings.Join(os.Args[1:], " ")) }
如果不关心输出格式,只想看看输出值,或许只是为了调试,可以用 Println 为我们
格式化输出。
fmt.Println(os.Args[1:])
这条语句的输出结果跟 strings.Join 得到的结果很像,只是被放到了一对方括号里。切片都
会被打印成这种格式。
golang学习笔记 ---命令行参数的更多相关文章
- Linux 编程学习笔记----命令行参数处理
转载请注明出处.http://blog.csdn.net/suool/article/details/38089001 问题引入----命令行參数及解析 在使用linux时,与windows最大的不同 ...
- golang学习笔记8 beego参数配置 打包linux命令
golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/mvc/contro ...
- TensorFlow-谷歌深度学习库 命令行参数
程序的入口: tf.app.run tf.app.run( main=None, argv=None ) 运行程序,可以提供'main'函数以及函数参数列表.处理flag解析然后执行main函数. 什 ...
- [笔记] 命令行参数 int main(int argc,char *argv[])
int main(int argc,char *argv[]) // argument count 变量个数 argument values 变量值 C程序的main函数有两个形参* argc:整数, ...
- GO学习笔记 - 命令行解析
本文主题:基于os.Args与flag实现Golang命令行解析. 小慢哥的原创文章,欢迎转载 目录 ▪ 一. os.Args ▪ 二. flag ▪ 三. 结合os.Args与flag实现子命令 ▪ ...
- [Shell学习笔记] 命令行下的高级网络工具cURL命令
原文: http://www.1987.name/365.html Linux curl命令是一个利用URL规则在命令行下工作的文件传输工具.它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯 ...
- golang学习笔记---命令源码文件接收参数(flag包)
命令源码文件怎样接收参数 go标准库中有一个代码包专门用于接收和解析命令参数.这个包叫flag 实例1: package main import ( "flag" "fm ...
- linux 中解析命令行参数(getopt_long用法)
linux 中解析命令行参数(getopt_long用法) http://www.educity.cn/linux/518242.html 详细解析命令行的getopt_long()函数 http:/ ...
- [C#学习笔记3]关于Main(string[ ] args)中args命令行参数
Main(string[] args)方法是C#程序的入口,程序从这里开始执行,在这里结束.C#代码逻辑要包含在一个类型(Type)中,游离的.全局的变量或函数是不存在的,这里的类型包括类(class ...
随机推荐
- 【Nodejs】外研社小学英语教材一年级起各年级英语音频下载(全)
两个爬虫合作成的,放在这里分享给有需要的人. 下载地址:https://pan.baidu.com/s/19hJ59SsX9uTfFtBxaRxJ8A 2018年5月10日
- (纪录片)科学的故事:权力、证据与激情 The Story Of Science: Power, Proof And Passion
简介: 导演: 纳特·沙曼编剧: 纳特·沙曼主演: Michael J. Mosley类型: 纪录片官方网站: www.bbc.co.uk/programmes/b00s9mms制片国家/地区: 英国 ...
- Code faster with Intellij IDEA live templates
Intellij IDEA – in my opinion the most productive IDE for Java – comes with bunch of features helpin ...
- 理解linux sed命令
理解linux sed命令(2010-02-27 18:21:20) 标签:linuxshellsed替换 分类:革命本钱 1. Sed简介sed是一种在线编辑器,它一次处理一行内容.处理时,把当 前 ...
- android中实现自定义广播
自定义广播分两个步骤:1.发送广播 2.接收广播 一.先看如何接收广播: 我使用的是Android Studio,File->New->Other->Broadcast Receiv ...
- cpu内存访问速度,磁盘和网络速度,所有人都应该知道的数字
google 工程师Jeff Dean 首先在他关于分布式系统的ppt文档列出来的,到处被引用的很多. 1纳秒等于10亿分之一秒,= 10 ^ -9 秒 ---------------------- ...
- Hibernate学习笔记一:项目创建与基本配置文件
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6760773.html 一:ORM ORM:对象-关系 映射. 即:把Java中有关联关系的对象,转换成关系型 ...
- cocos2d-js Shader系列2:在cc.Sprite上使用Shader(黑白、灰度、造旧效果)
在Sprite中使用Shader做特殊的颜色处理比较简单,只需要把Shader程序绑定到Sprite上即可: sprite.shaderProgram = alphaTestShader; Cocos ...
- java第五节 多线程/多线程的同步
/* 第五讲 多线程 了解进程和线程 在多任务系统中,每个独立执行的程序称为进程,也就是"正在进行的程序",我们现在使用的操作系统一般都是多任务的 即能够同时执行多个应用程序,实际 ...
- Linux 防火墙Iptables
1.规则链INPUT——进来的数据包应用此规则链中的策略OUTPUT——外出的数据包应用此规则链中的策略FORWARD——转发数据包时应用此规则链中的策略PREROUTING——对数据包作路由选择前应 ...