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 ...
随机推荐
- iOS 里RGB 配色 UIColor colorWithRed
//比如rgb 色值为73. 148 .230 那么ios 里面要在后面加.0f 再除以255 [bline setBackgroundColor:[UIColor colorWithRed:73.0 ...
- git设置默认编辑为vim
f you want to set the editor only for Git, do either (you don’t need both): Set core.editor in your ...
- canvas绘制图片
canvas保存为data:image扩展功能的实现 [已知]canvas提供了toDataURL的接口,可以方便的将canvas画布转化成base64编码的image.目前支持的最好的是png格式, ...
- POSTGRESQL 支持正则表达式
昨天遇到了一个奇葩的问题,需要在WHERE条件里面添加正则表达式,抱着试试看的态度,查看了一下postgresql,发现确实可以支持正则,例如: select * from user where em ...
- JAVA统计中文的个数
尝试了一下 不错~ /** * 获取字符串的长度,中文占一个字符,英文数字占半个字符 * * @param value 指定的字符串 * @return 字符串的长度 */ public static ...
- Windows Live Writer离线写CSDN博客
初始化配置 http://blog.csdn.net/csdnproduct/article/details/27504397 代码着色功能插件: http://www.cnblogs.com/cmt ...
- Oracle11g口令过期的解决
今天发现服务器上的Oracle11g突然登录不上去了,提示ORA-28002错误,说是口令过期. 1. 用DBA账户登录SQL PLUS.我用的是SYS. 2. 系统会提示口令失效,但是会马上让你重置 ...
- java base64编码、解码的三种方式
java base64编码.解码 CreationTime--2018年7月24日10点38分 Author:Marydon 1.方式一:DatatypeConverter 说明:使用jdk自带的 ...
- 【树莓派+.NET MF打造视频监控智能车】控制篇(.NET MF)
在上一篇<遥控篇>文章中,我们介绍了Sony PS2手柄信号的采集和编程,通过简单的封装,以事件的方式向我们提供按键信息.本篇文章主要介绍.NET Micro Framework系统接受到 ...
- android手机导入.cer证书文件的方法
访问很多https协议的网站需要安装证书,手机也可以导入cer文件,你知道么?本文将通过简单的两步告诉你手机安装cer文件的方法. 步骤一:请先将数字证书文件“******.cer”文件复制到SD卡的 ...