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 ...
随机推荐
- 【Python】列表(数组)的引用和拷贝
# Python里对象赋值传递的引用 arr=[1,2,3,4,5] newArr=arr arr[1]=9 print('arr='+str(arr)) print('newArr='+str(ne ...
- Android 获得图片并解码成缩略图以减少内存消耗
本文内容 环境 演示 下载 Demo 环境 Windows 2008 R2 64 位 Eclipse ADT V22.6.2,Android 4.4.3 SAMSUNG GT-I9008L,Andro ...
- MVC4发布到IIS,出现HTTP 错误 404.0 - Not Found
web.config中添加 <system.webServer> <modules runAllManagedModulesForAllRequests="true&quo ...
- Solidworks如何打开swb文件
把swb文件拖放到Solidworks里面,会弹出窗口选择一个文件夹 随后会自动生成对应的文件,装配体
- iOS 开发者证书总结 in-house
iOS 证书分两种类型. 第一种为$99美元的,这种账号有个人和公司的区别,公司账号能创建多个子账号,但个人的不能.这种账号可以用来上传app store 第二种为¥299美元的,这种账号只能用于企业 ...
- C++ 第二课:操作符号的优先级
优先级 操作符 1 () [] -> . :: ! ~ ++ -- 2 - (unary) * (dereference) & (addre ...
- Java BIO、NIO、AIO 学习
正在学习<大型网站系统与JAVA中间件实践>,发现对BIO.NIO.AIO的概念很模糊,写一篇博客记录下来.先来说个银行取款的例子: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO ...
- tornado url配置
Note tornado是支持虚拟主机的,在同一端口上根据域名区分app http://www.tornadoweb.org/en/stable/web.html#application-config ...
- 使用hadoop eclipse plugin提交Job并添加多个第三方jar
来自:http://heipark.iteye.com/blog/1171923 通过 "conf.set("tmpjars", jars);" 可以设置第三方 ...
- Array相关的属性和方法
这里只是做了相关的列举,具体的使用方法,请参考网址. Array 对象属性 constructor 返回对创建此对象的数组函数的引用. var test=new Array(); if (test.c ...