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 圣经阅读笔记之-入门的更多相关文章

  1. Hadoop阅读笔记(四)——一幅图看透MapReduce机制

    时至今日,已然看到第十章,似乎越是焦躁什么时候能翻完这本圣经的时候也让自己变得更加浮躁,想想后面还有一半的行程没走,我觉得这样“有口无心”的学习方式是不奏效的,或者是收效甚微的.如果有幸能有大牛路过, ...

  2. Hadoop阅读笔记(三)——深入MapReduce排序和单表连接

    继上篇了解了使用MapReduce计算平均数以及去重后,我们再来一探MapReduce在排序以及单表关联上的处理方法.在MapReduce系列的第一篇就有说过,MapReduce不仅是一种分布式的计算 ...

  3. Hadoop阅读笔记(二)——利用MapReduce求平均数和去重

    前言:圣诞节来了,我怎么能虚度光阴呢?!依稀记得,那一年,大家互赠贺卡,短短几行字,字字融化在心里:那一年,大家在水果市场,寻找那些最能代表自己心意的苹果香蕉梨,摸着冰冷的水果外皮,内心早已滚烫.这一 ...

  4. Mongodb Manual阅读笔记:CH4 管理

    4 管理 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔 ...

  5. WebSocket学习笔记——无痛入门

    WebSocket学习笔记——无痛入门 标签: websocket 2014-04-09 22:05 4987人阅读 评论(1) 收藏 举报  分类: 物联网学习笔记(37)  版权声明:本文为博主原 ...

  6. 阅读笔记 1 火球 UML大战需求分析

    伴随着七天国庆的结束,紧张的学习生活也开始了,首先声明,阅读笔记随着我不断地阅读进度会慢慢更新,而不是一次性的写完,所以会重复的编辑.对于我选的这本   <火球 UML大战需求分析>,首先 ...

  7. [阅读笔记]Software optimization resources

    http://www.agner.org/optimize/#manuals 阅读笔记Optimizing software in C++   7. The efficiency of differe ...

  8. 《uml大战需求分析》阅读笔记05

    <uml大战需求分析>阅读笔记05 这次我主要阅读了这本书的第九十章,通过看这章的知识了解了不少的知识开发某系统的重要前提是:这个系统有谁在用?这些人通过这个系统能做什么事? 一般搞清楚这 ...

  9. <<UML大战需求分析>>阅读笔记(2)

    <<UML大战需求分析>>阅读笔记(2)> 此次读了uml大战需求分析的第三四章,我发现这本书讲的特别的好,由于这学期正在学习设计模式这本书,这本书就讲究对uml图的利用 ...

随机推荐

  1. python简说(十二)time模块

    1.时间戳 print(int(time.time())) 2.取当前格式化好的时间 time.strftime('%Y-%m-%d %H:%M:%S') 3.时间戳转为格式化好的时间 time1 = ...

  2. python,pycharm安装

    下载python地址:https://www.python.org/downloads/release/python-371/ 安装python ***python安装目录下的scripts加入环境变 ...

  3. JAVA中拆箱和装箱

    浅谈JAVA中拆箱与装箱 一.  什么是装箱?什么是拆箱? 在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行: Integer i = new Integer(10) ...

  4. 【python51--__name__属性】

    一.基础知识 1.__name__ == '__main__' 所有模块都有一个__name__属性,__name__的值取决于如何应用模块,在作为独立程序运行的时候,__name__属性的值是‘__ ...

  5. topcoder srm 686 div1

    problem1 link 左括号和右括号较少的一种不会大于20.假设左括号少.设$f[i][mask][k]$表示处理了前$i$个字符,其中留下的字符以$k$开头($k=0$表示'(',$k=1$表 ...

  6. Oracle SQL——varchar2() 和 char()关联查询 存在空格

    背景 表dbcontinfo 字段loanid,类型为varchar2(60) 表dbloanbal 字段loanid,类型为char(60) loanid字段实际长度为24位 问题 两张表dbloa ...

  7. Bootstrap3基础 container 浏览器宽度与容器宽度的四种配合

      内容 参数   OS   Windows 10 x64   browser   Firefox 65.0.2   framework     Bootstrap 3.3.7   editor    ...

  8. 如何生成指定架构的Linux内核默认配置文件

    答: make ARCH=<cpu architecture> defconfig 举例如下: make ARCH=arm64 defconfig (编译系统将会去目录arch/arm64 ...

  9. 使用msi自动安装系统

    在实际生活中, 还是要尽量使用 自动化 脚本 等来处理/执行问题, 那样更快更省力省时间 要多使用 网络工具, 网络工具在 管理/ 使用网络的过程 中还是很有用的. 要有这种 "多使用网络工 ...

  10. 2-sat相关复习

    2-sat相关复习 noi曾经考过,谁能说得准呢 sat问题 通俗的sat问题表述一般是这样的:有很多个集合,每个集合里面有若干元素,现给出一些取元素的规则,要你判断是否可行,可行则给出一个可行方案. ...