go 圣经阅读笔记之-入门
go 圣经 这本书英文名为 《The Go Programming Language》
1. 简单hello world示例
helloworld.go
package main import "fmt" func main() {
//打印 hello, 世界
fmt.Println("Hello, 世界")
}
运行,正常情况下会输出“Hello, 世界”:
[root@centos src]# go run helloworld.go
Hello, 世界
如果要保存编译结果(helloworld)以备将来之用。 可以用build子命令:
[root@centos src]# go build helloworld.go
[root@centos src]# ll
总用量 1872
-rwxr-xr-x. 1 root root 1906945 1月 12 00:04 helloworld
-rw-r--r--. 1 root root 79 1月 12 00:01 helloworld.go
[root@centos src]# ./helloworld
Hello, 世界
下面来看各行代码的意义:
package main:定义了包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。
import "fmt":告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),fmt 包实现了格式化 IO(输入/输出)的函数。
func main() :是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数。
fmt.Println(...) :可以将字符串输出到控制台,并在最后自动增加换行字符 \n。 使用 fmt.Print("hello, world\n") 可以得到相同的结果。
//打印 hello, 世界:为注释,Go继承自C/C++因此注释相同,使用//单行注释或者/**/多行注释。
注意:Go语言不需要在语句或者声明的末尾添加分号, 除非一行上有多条语句
2. 命令行参数
(1)os包以跨平台的方式, 提供了一些与操作系统交互的函数和变量。程序的命令行参数可从os包的Args变量获取; os包外部使用os.Args访问该变量。
首先来看Unix里echo命令的一份实现, echo把它的命令行参数打印成一行 :
// Echo1 prints its command-line arguments.
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)
}
这里声明了两个string类型变量 s, sep 会被隐式的初始化为空字符串(""),运算符 += 是赋值运算符。符号 := 是短变量声明的一部分, 这是定义一个或多个变量并根据它们的初始值为这些变量赋予适当类型的语句(i := 1,初始值为1,因此 i 为int类型)。
注意:自增语句 i++ 给 i 加1; 这和 i += 1 以及 i = i + 1 都是等价的 。这里的 i++ 是语句(C语言中是表达式),因此,j = i++ 非法, 而且++和--都只能放在变量名后面, 因此 --i 也非法,注意和C语言之间的区别。
(2)for 循环
1)for 循环的第一种形式
Go语言只有for循环这一种循环语句。 for循环有多种形式, 其中一种如下所示:
for initialization; condition; post {
// zero or more statements
}
for循环三个部分不需括号包围。 大括号强制要求, 左大括号必须和post语句在同一行。for循环的这三个部分每个都可以省略 ,如果连 condition 也省略了就变成一个无限循环 。可以用其他方式终止循环, 如一条 break 或 return 语
句。
// a traditional infinite loop
for {
// ...
}
2)for 循环的第二种形式
在某种数据类型的区间( range) 上遍历, 如字符串或切片。 echo 的第二版本展示了这种形式:
// Echo2 prints its command-line arguments.
package main import (
"fmt"
"os"
) func main() {
s, sep := "", ""
for _, arg := range os.Args[1:] {
s += sep + arg
sep = " "
}
fmt.Println(s)
}
每次循环迭代, range 产生一对值; 索引以及在该索引处的元素值。 这个例子不需要索引,但 range 的语法要求, 要处理元素, 必须处理索引。 一种思路是把索引赋值给一个临时变量,如 temp , 然后忽略它的值, 但Go语言不允许使用无用的局部变量( local variables) , 因为这
会导致编译错误。 Go语言中这种情况的解决方法是用 空标识符 ( blank identifier) , 即 _ ( 也就是下划线) 。空标识符可用于任何语法需要变量名但程序逻辑不需要的时候。
声明一个变量有好几种方式, 下面这些都等价:
s := ""
var s string
var s = ""
var s string = ""
第一种形式, 是一条短变量声明, 最简洁, 但只能用在函数内部, 而不能用于包变量。
第二种形式依赖于字符串的默认初始化零值机制, 被初始化为""。
第三种形式用得很少, 除非同时声明多个变量。
第四种形式显式地标明变量的类型, 当变量类 型与初值类型相同时, 类型冗余, 但如果两者类型不同, 变量类型就必须了。 实践中一般使用前两种形式中的某个, 初始值重要的话就显式地指定变量的类型, 否则使用隐式初始化。
上面实现的echo程序 每次循环都会更新 s 如果连接涉及的数据量很大, 这种方式代价高昂。 一种简单且高效的解决方案是使用 strings 包的 Join 函数
func main() {
fmt.Println(strings.Join(os.Args[1:], " "))
}
3. 查找重复的行
go 圣经阅读笔记之-入门的更多相关文章
- Hadoop阅读笔记(四)——一幅图看透MapReduce机制
时至今日,已然看到第十章,似乎越是焦躁什么时候能翻完这本圣经的时候也让自己变得更加浮躁,想想后面还有一半的行程没走,我觉得这样“有口无心”的学习方式是不奏效的,或者是收效甚微的.如果有幸能有大牛路过, ...
- Hadoop阅读笔记(三)——深入MapReduce排序和单表连接
继上篇了解了使用MapReduce计算平均数以及去重后,我们再来一探MapReduce在排序以及单表关联上的处理方法.在MapReduce系列的第一篇就有说过,MapReduce不仅是一种分布式的计算 ...
- Hadoop阅读笔记(二)——利用MapReduce求平均数和去重
前言:圣诞节来了,我怎么能虚度光阴呢?!依稀记得,那一年,大家互赠贺卡,短短几行字,字字融化在心里:那一年,大家在水果市场,寻找那些最能代表自己心意的苹果香蕉梨,摸着冰冷的水果外皮,内心早已滚烫.这一 ...
- Mongodb Manual阅读笔记:CH4 管理
4 管理 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔 ...
- WebSocket学习笔记——无痛入门
WebSocket学习笔记——无痛入门 标签: websocket 2014-04-09 22:05 4987人阅读 评论(1) 收藏 举报 分类: 物联网学习笔记(37) 版权声明:本文为博主原 ...
- 阅读笔记 1 火球 UML大战需求分析
伴随着七天国庆的结束,紧张的学习生活也开始了,首先声明,阅读笔记随着我不断地阅读进度会慢慢更新,而不是一次性的写完,所以会重复的编辑.对于我选的这本 <火球 UML大战需求分析>,首先 ...
- [阅读笔记]Software optimization resources
http://www.agner.org/optimize/#manuals 阅读笔记Optimizing software in C++ 7. The efficiency of differe ...
- 《uml大战需求分析》阅读笔记05
<uml大战需求分析>阅读笔记05 这次我主要阅读了这本书的第九十章,通过看这章的知识了解了不少的知识开发某系统的重要前提是:这个系统有谁在用?这些人通过这个系统能做什么事? 一般搞清楚这 ...
- <<UML大战需求分析>>阅读笔记(2)
<<UML大战需求分析>>阅读笔记(2)> 此次读了uml大战需求分析的第三四章,我发现这本书讲的特别的好,由于这学期正在学习设计模式这本书,这本书就讲究对uml图的利用 ...
随机推荐
- redhat7.4+shell离线安装docker
首先要准备离线安装包 1.docker官网下载 2.docker-compose gitbub官网下载 3.我的docker-compose install-docker.sh #!/bin/sh u ...
- 批处理:根据进程名称查询进程,如果有进程就输出up没有就输出donw
需求:windows系统上 根据进程名称查询进程,如果有进程就输出 up ,没有就输出 donw. ::Final interpretation is owned by chenglee ::@e ...
- topcoder srm 712 div1
problem1 link 将$a_{0},a_{1},...,a_{n-1}$看做$a_{0}x^{0}+a_{1}x^{1}+...+a_{n-1}x^{n-1}$.那么第一种操作相当于乘以$1+ ...
- Java TreeSet的定制排序
注:只贴出实现类 package Test3; import java.util.Comparator;import java.util.TreeSet; public class Test { pu ...
- 【做题】CF285E. Positions in Permutations——dp+容斥
题意:求所有长度为\(n\)的排列\(p\)中,有多少个满足:对于所有\(i \,(1 \leq i \leq n)\),其中恰好有\(k\)个满足\(|p_i - i| = 1\).答案对\(10^ ...
- (zhuan) Paper Collection of Multi-Agent Reinforcement Learning (MARL)
this blog from: https://github.com/LantaoYu/MARL-Papers Paper Collection of Multi-Agent Reinforcemen ...
- (转载)一张表搞清楚西门子S7系列标准DB块与优化DB块
在TIA Portal中为S7-1200/S7-1500 CPU 添加一个 DB 块时,其缺省属性为优化的 DB ,优化的 DB 块与标准的 DB 块整体对比如下表所示: 项 标准 DB 优化 DB ...
- 使用Python制作第一个爬虫程序
用到的开发环境 IDE:pycharm python version :2.7 掌握的知识: Pycharm 还能更改Python的版本 代码如下:(重点就是 正则表达式的学习) # !/u ...
- Hbase与Oracle比较(列式数据库与行式数据库)
Hbase与Oracle比较(列式数据库与行式数据库) 1 主要区别 Hbase适合大量插入同时又有读的情况 Hbase的瓶颈是硬盘传输速度,Oracle的瓶颈是硬盘寻道时间. Hbase本质上只 ...
- Kubernetes体系结构
Nodes Node Status Addresses Phase Condition Capacity Info Management Node Controller Self-Registra ...