继续讲
当然我还是很推荐大家能够看看官方文档,人家都把东西写在那里,其他人写的东西也都是从那里来的。其次他们的那些体会和使用经验也是值得看一看的,之后就是自己去写写。
与其他语言相同,main函数是整个程序的入口,main包比较特殊,它定义了一个可执行的程序,而不是一个库。
同时GO语言要求你导入的包全部都有使用过,不然编译不会通过:
go语言不需要在每段的末尾添加分号,但是如果一行有多个执行语句的话就需要分开,加上。(但也没有谁会这么写吧)
其实go语言会在特定符号后的换行符将其用分号代替,这样的话换行符的位置就影响了go是否可以正确的解析,这也就是为什么当我们写func函数的时候需要把前大括号给放在同一行,不能独占一行。还有当做x+y操作的时候可以在+后换行,但是不能在+前换行,不然会编译失败。
go还提供了格式化代码的工具,是go工具的一个子命令fmt,使用方法就是:
当然如果你想要一次性格式化所有的go源文件的话可以使用
.\...来替换,这样包括当前目录下的子目录也会被格式化。值得一提的是,在使用这个之前可以考虑对之前的文件进行备份或者使用版本控制工具。
很多文本编辑器都可以配置为保存文件时自动执行gofmt,这样你的源代码总会被恰当地格式化。还有个相关的工具,goimports,可以根据代码需要,自动地添加或删除import声明。这个工具并没有包含在标准的分发包中,可以用下面的命令安装:
$ go get golang.org/x/tools/cmd/goimports
(可能变了,也可能没变)
命令行参数
GO提供了os包来用跨平台的方式,提供了一些与操作系统交互的变量和函数。程序命令行参数是众多程序输入的一种,可以通过os里面的Args变量来获取。
这个Args是一个字符串切片,现在先不细讲,我们假定s是字符串切片,它的长度是动态变化的。可以使用s[n]的方式来访问当个元素,使用s[n:m]来获得子切片(也就是参数m和n规定的位置,遵循左闭右开的原则,从0开始)。
os.Args[0]是本身命令的名字,其他元素是程序启动时候传入的参数。
os.Args[1:len(os.Args)]切片中。如果省略切片表达式的m或n,会默认传入0或len(s),因此前面的切片可以简写成os.Args[1:]。
按照惯例,我们会在每个包的包声明前添加注释来从整体角度说明功能。
我们使用var关键字来创建变量,学习其他语言的话对于go的变量创建会很别扭,我就是这样,经常无法第一时间看出来到底是写得什么东西。
go语言创建变量是这样的:var s,sep string来创建两个字符串类型的变量,它是把变量类型放在后面的。
变量会在声明的时候被初始化,如果一开始没有显示地初始化会被隐式的初始化成为零值,数值类型会是0,字符串类型会是空字符串。
当然在初始化的时候也可以使用短变量声明:=,它会根据具体赋给的初值来判断类型。
比较特殊的一点对我来说就是:
自增语句
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
}
GO语言不再需要把前面的三个部分进行包裹,{必须和for保持在同一行上。