提示:本系列文章适合有其他语音基础并对Go有持续冲动的读者

一、package介绍

​ Go语言的代码是通过package来组织的,package的概念和你知道的其它语言 里的libraries或者modules概念比较类似。

​ 一个package会包含一个或多个.go结束的源代码文件。每一 个源文件都是以一个package xxx的声明语句开头的,比如我们的例子里就是package main。这行声明语 句表示该文件是属于哪一个package,紧跟着是一系列import的package名,表示这个文件中引入的 package。再之后是本文件本身的代码。

​ package main是一个比较特殊的package。这个package里会定义一个独立的程序,这个程序是可以运行 的,而不是像其它package一样对应一个library。

​ 这也正是因为go语言必须引入所有要用到的package的原则,假如你没有在代码里import需要用到的 package,程序将无法编译通过,同时当你import了没有用到的package,也会无法编译通过。

二、命令行参数

​ os这个package提供了操作系统无关(跨平台)的,与系统交互的一些函数和相关的变量,运行时程序的 命令行参数可以通过os包中一个叫Args的变量来获取;当在os包外部使用该变量时,需要用os.Args来访问。

os.Args的第一个元素,即os.Args[0]是命令行执行时的命令本身;其它的元素则是执行该命令时传给这 个程序的参数。前面提到的切片表达式,s[m:n]会返回第m到第n-1个元素,所以下一个例子里需要用到 的os.Args[1:len(os.Args)]即是除了命令本身外的所有传入参数。如果我们省略s[m:n]里的m和n,那么 默认这个表达式会填入0:len(s),所以这里我们还可以省略掉n,写成os.Args[1:]。

1.输出命令行参数
// go 中命令行参数的使用
package main import (
"fmt"
"os"
) func main() {
var s, seq string
seq = " "
for i := 1; i < len(os.Args); i++ {
s += os.Args[i] + seq
}
fmt.Println(s)
} [root@VM-0-5-centos course1]# go run lesson-1.go hello world
hello world

2.关于循环

在Go语言里只有for循环一种循环。

for initialization; condition; post {
// zero or more statements
} // a traditional "while" loop
for condition {
// ...
} // a traditional infinite loop
for {
// ...
}

range

每次循环迭代,range产生一对值;索引以及在该索引处的元素值。这个例子不需要索引,但range的语法要求, 要处理元素, 必须处理索引。一种思路是把索引赋值给一个临时变量, 如temp, 然后忽略它的值,但Go语言不允许使用无用的局部变量(local variables),因为这会导致编译错误。

Go语言中这种情况的解决方法是用空标识符(blank identifier),即_(也就是下划线)。空标识符可用于任何语法需要变量名但程序逻辑不需要的时候, 例如, 在循环里,丢弃不需要的循环索引, 保留元素值。大多数的Go程序员都会像上面这样使用range_echo程序,因为隐式地而非显式地索引os.Args,容易写对。

package main

import (
"fmt"
"os"
) func main() {
var s string
seq := " " for _, arg := range os.Args[1:] {
s += arg + seq
}
fmt.Println(s)
}

strings.Join连接参数

package main

import (
"fmt"
"os"
"strings"
) func main() {
var s string
s = strings.Join(os.Args[1:], " ")
fmt.Println(s)
fmt.Println(os.Args[1:]) //切片的方式输出
} [root@VM-0-5-centos course1]# go run join.go wo apple ibm cisco
wo apple ibm cisco
[wo apple ibm cisco]

三、 练习

练习 1.1: 修改echo程序,使其打印每个参数的索引和值,每个一行。

package main

import (
"fmt"
"os"
) func main() {
var s string
seq := " " for index, arg := range os.Args[1:] {
s += arg + seq
//fmt.Println("yees" + s)
fmt.Println(index, arg)
}
//fmt.Println(s)
}

练习 1.2: 修改echo程序,使其能够打印os.Args[0],即被执行命令本身的名字。

package main

import (
"fmt"
"os"
) func main() {
var s string
seq := " " for index, arg := range os.Args[1:] {
s += arg + seq
//fmt.Println("yees" + s)
fmt.Println(index, arg)
}
fmt.Println(os.Args[0])
}
//output
[root@VM-0-5-centos course1]# go run for_range.go apple ibm
0 apple
1 ibm
/tmp/go-build844979177/b001/exe/for_range

练习 1.3: 做实验测量潜在低效的版本和使用了strings.Join的版本的运行时间差异。(time包)

//for循环遍历
package main import (
"fmt"
"os"
"time"
) func main() {
var s, seq string
seq = " "
var start_time = time.Now()
for i := 1; i < len(os.Args); i++ {
s += os.Args[i] + seq
}
fmt.Println(s)
end_time := time.Now()
fmt.Println(end_time.Sub(start_time))
} [root@VM-0-5-centos course1]# go run comandline.go apple ibm
apple ibm
19.667µs //join连接
package main import (
"fmt"
"os"
"strings"
"time"
) func main() {
var s string
start_time := time.Now()
s = strings.Join(os.Args[1:], " ")
fmt.Println(s)
//fmt.Println(os.Args[1:])
end_time := time.Now()
fmt.Println(end_time.Sub(start_time))
} [root@VM-0-5-centos course1]# go run join.go apple ibm
apple ibm
16.782µs

书籍参考:Go语言圣经中文版

文章有不足的地方欢迎在评论区指出。

欢迎收藏、点赞、提问。关注顶级饮水机管理员,除了管烧热水,有时还做点别的。

Go快速入门(二)的更多相关文章

  1. python3.5+django2.0快速入门(二)

    昨天写了python3.5+django2.0快速入门(一)今天将讲解配置数据库,创建模型,还有admin的后台管理. 配置数据库 我们打开mysite/mysite/settings.py这个文件. ...

  2. Linux Bash Shell快速入门 (二)

    BASH 中的变量介绍BASH 中的变量都是不能含有保留字,不能含有 "-" 等保留字符,也不能含有空格. 简单变量在 BASH 中变量定义是不需要的,没有 "int i ...

  3. Mysql快速入门(二)

    多表关联查询 JOIN 按照功能大致分为如下三类: CROSS JOIN(交叉连接) INNER JOIN(内连接或等值连接). OUTER JOIN(外连接) 交叉连接 交叉连接的关键字:CROSS ...

  4. Ant快速入门(二)-----使用Ant工具

    使用Ant非常简单,当正确安装Ant后,只要输入ant或ant.bat即可. 如果运行ant命令时没有指定任何参数,Ant会在当前目录下搜索build.xml文件.如果找到了就以该文件作为生成文件,并 ...

  5. mybatis快速入门(二)

    这次接着上次写增删改查吧. 现将上节的方法改造一下,改造测试类. package cn.my.test; import java.io.IOException; import java.io.Inpu ...

  6. jquery 快速入门二

    ---恢复内容开始--- 操作标签 样式操作 样式类 addClass();//添加指定的CSS类名. removeClass();//移除指定的类名. hasClass();//判断样式不存在 to ...

  7. Solr.NET快速入门(二)

    字典映射和动态字段 Solr dynamicFields可以根据用例不同地映射. 它们可以被"静态地"映射,例如,给定: <dynamicField name="p ...

  8. Dubbo快速入门 二

    2.dubbo核心概念 2.1).简介 Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能.轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调 ...

  9. Hive数仓之快速入门(二)

    上次已经讲了<Hive数据仓库之快速入门一>不记得的小伙伴可以点击回顾一下,接下来我们再讲Hive数据仓库之快速入门二 DQL hive中的order by.distribute by.s ...

  10. ELK快速入门(二)通过logstash收集日志

    ELK快速入门二-通过logstash收集日志 说明 这里的环境接着上面的ELK快速入门-基本部署文章继续下面的操作. 收集多个日志文件 1)logstash配置文件编写 [root@linux-el ...

随机推荐

  1. Android Studio 待看博文

    •前言 学习过程中找到的一些好的博文,有些可能当时就看完了并解决了我的问题,有些可能需要好几天的事件才能消化. 特此记录,方便查阅. •CSDN 给新人的一些基础常识 TextView的文字长度测量及 ...

  2. 批量实现SSH无密码登陆认证脚本

    批量实现SSH无密码登陆认证脚本 问题背景 使用为了让linux之间使用ssh不需要密码,可以采用了数字签名RSA或者DSA来完成.主要使用ssh-key-gen实现. 1.通过 ssh-key-ge ...

  3. 高精度减法(c++)

    高精度减法 每当要进行精度较高的运算时,就要用到高精度. 下图是各个类型的数值范围: 如果想不起各个类型占多少字节,可以采用下面的方法: printf("%d %d",sizeof ...

  4. 【Python学习笔记】-虚拟环境virtualenv

    在开发python应用程序的时候,系统安装的python3只有一个版本:3.4.所有的第三方的包都回被pip安装到python3的site-packages目录下. 如果我们要要同时开发多个应用程序, ...

  5. oo第二单元博客总结

    P1 设计结构 三次作业的架构都没有较大的改动,基本上都是靠调度器接受输入的请求并放入队列,然后调度器根据不同的电梯的当前状态来把请求分配至不同电梯的请求队列中,最后电梯再根据自己的请求队列去运行.因 ...

  6. Markdown 数学公式一览

    Typora--数学公式 1. 分数\平方\下标 算式 markdown \(\frac{7x_1}{1+y_{3}^2}\) \frac{7x_1}{1+y_{3}^2} 2. 省略号 省略号 ma ...

  7. Java 使用 Maven BOM 统一管理版本号

    一个中大型的 Java 项目往往包含若干 JAR 包,这些 JAR 包有着不同的版本号.如果这些 JAR 包单独发布,然后直接通过版本号引用相应的 JAR 包,不同版本的兼容性维护将变得十分麻烦.为了 ...

  8. vm16 安装 || 待检验 || 预测无问题

    vm16 安装 安装 下载 下载地址 管理员运行 安装 其余都点下一步/NEXT 激活 完成

  9. Day05_17_面向对象编程

    Java面向对象 面向对象编程 和 面向过程编程 举个例子: 用面向过程的方法写出来的程序是一份蛋炒饭,而用面向对象写出来的程序是一份盖浇饭. 面向过程编程: 主要关注事物因果关系的实现,面向过程就是 ...

  10. 另类的曲线方式定时Start up/Shut down VM 的解决方案

    一,引言 最近看到一位小兄弟在为了做 Azure 云虚拟机的自动关机开启 在群里求助,最后也不知道结果咋样了. 至于他提到的利用 Automation Account 我是没有接触过,并且也没有看资料 ...