脱掉Golang的第一层衣裳

海鳖曾欺井内蛙,大鹏张翅绕天涯。强中更有强中手,莫向人前满自夸。

各位看官,现在开始脱衣裳。你不用脱,自个衣裳要穿好了,别脱下来。我们是来学Golang的,不是来耍流氓的。本节,我们来正式的学习Golang。如果前面几节一路看下来,能看到自己写的golang代码正常运行,自然好事一件。但不能就以为学会golang了。学任何东西,都不能自满。强中自有强中手,人外自有计高人。如果看不到也不要灰心,我只是做了个普及,好比正餐前的开胃菜。合口就多吃,不合口就等着下面的大餐。

花来两朵,各表一枝。Party现在正式开始。

Golang的程序结构

一个完整且典型的Golang程序包含以下几部分:

  • 包声明(Package Declaration)
  • 引入依赖包(Import Packages)
  • 逻辑函数(Function)
  • 过程变量(Variables)
  • 语句和表达式(Statements and Expressions)
  • 注释(Comments)

麻雀虽小,五脏俱全。 再小的耗子也是耗子,我们把之前的hello god再次搬上来,逐一对照一下:

  1. 1. package main
  2. 2. import "fmt"
  3. 3. func main() {
  4. 4. /* This is my first sample program. */
  5. 5. var str = "Hello God, My Golang.\n"
  6. 6. fmt.Printf(str)
  7. 7. }

第一行的package main,叫做包声明。包,又名package,是golang的名字。一个人没名字,还能比划一下多高多胖。但程序代码没名字,鬼才知道怎么调用呢。 所以每个Golang程序必须要有名字。 这个名字就是package后面的单词。 上面的代码中定义这个包叫做main。

第二行就是引入的依赖包。 看到fmt这么短的名字,应该想到这是一个标准包。如果忘记三类包如何区分了,😑,大哥,上点心别走神,返回上节重新温习。在Golang中引入依赖包,就用"import 包名"的格式引入。一个程序不可能引入一个包吧? 引入的包多了怎么办? 有两种方法:

  1. 方法一:逐行import
  2. import fmt
  3. import log
  4. import net/http

难不难看?丑不丑? 肯定难看,所以基本上,都会写成下面这样:

  1. import (
  2. "io/ioutil"
  3. "log"
  4. "time"

还丑? 那没辙了,凑合看吧。基本上各种IDE,在格式化golang代码时,都会格式化成第二种。所以建议直接用第二种,反正你用了第一种,IDE格式化时也会给你变成第二种。

从第三行到第七行,就是函数的范围了。 Golang的函数格式是: func 函数名(参数…){}。 Golang本身就支持函数式编程,所以有名无名无所谓。但如果现在就开始说函数式编程,你不看晕,我都快写晕了。所以现在先不提这事,留到后面再说。

在函数名称上面,Golang有个特殊规定。首字母是大写的,表示允许其他包可以直接调用。 如果首字母是小写的,则不允许其他包调用。简而言之,首字母大写,表示允许其他包可见。而小写,就表示函数不可见。而main函数是个特例,它就叫做main。因为main表示整个函数的入口,所以golang替你规定好了,所有的函数入口一律叫做main,写别的,对不起不认识。

最后还要记住一点,main函数一定在main包里。 试试把package main改成test,go build之后看看有没有可执行文件?一定没有。

第四行是注释。 和其它语言一样,支持/**/注释,也支持//注释。 注释很重要,好记性不如烂笔头。写好注释,指不定哪天会挽救你那可怜的职业生涯,尤其是在线上出现bug,大老板站在你身后,而自己又不知道为啥要写这一行代码时。想想那个场景,就不寒而栗。

第五行,是传说中的变量声明。Golang声明变量,也有两种方式。

  1. --- 我是声明方式一 ---
  2. var 变量名 变量类型
  3. --- 我是声明方式二 ---
  4. 变量名 := 变量类型

第一种使用最多的情况是,声明基本类型。例如string,boolean,int等等。比如声明一个字符串: var str string。 str 是变量名,string是变量类型。然后声明之后,还给它赋值,str = "I am Lilei, what's your name?"。 但这样看起来啰嗦,不简洁。所以都会这么写:

  1. var str = "I am Lilei, what's your name?"

基本类型都可以这么去赋值,而第二种多用在复杂类型上,例如声明一个结构体实例:

  1. obj1 := Object{
  2. xxxx:xxxx,
  3. yyyy:yyyy,
  4. }

现在还没说到结构体,所以上面这一段可以略过不看。

这两种声明方式没有强制规定,必须用在什么场景中。还是那句话,高兴就好,怎么写的嗨,就怎么写。规矩是死的,人是活的。

但别看没有强制规定,就用混了。 Golang中通过":="来表示新变量。也就是说,如果你用了var来声明,就直接使用"="。 如果你不想写var,就使用":="。变量声明就这么点小提示,开心的去玩吧。 写错写多了,也就记住了。😄

第六行,是语句。 也称之为表达式。其实声明变量也属于语句的一种,说白了,函数就是由语句组成的。 和其他程序不一样的是,Golang的语句是通过换行符来断句的。也就是一行是一个语句,有的语言是通过";"这一类的符号来断句的。 但Golang是通过换行符,刚转过来的同学,适应适应吧。

好,我们就把上面的小Demo解剖完了,但衣裳还没拔完,继续"流氓"。

Golang的基本语法

上来,先说Golang中哪些是不允许你瞎命名的,也就是Golang的保留关键字.

Golang 关键字
breakdefaultfuncinterfaceselect
casedeferGomapStruct
chanelseGotopackageSwitch
constfallthroughifrangeType
continueforimportreturnVar

表里面的单词,都是Golang独家享有的,你写程序时无论是变量还是函数都不能和上面的单词重名。

再往后就是Golang中空格的使用,golang通过空格来识别语义,例如:

  1. var age int

这三个单词之间通过空格隔开,golang再编译时,就可以识别出var,age和int。就能明白你的意图。如果你中间没有空格,那编译器都傻眼了。所以在写代码时,记住正确使用空格。

如果命名时避开了关键字,是不是就可以随便命名了?当然不是的,Golang已经规定了标识符的命名规则。Golang规定:

  1. 一个标识符必须以字母aZaZ或一个下划线开头,后面跟着零或更多的字母、下划线和数字(09)。

为了便于理解和免于鄙视,老老实实的命名,别用那么多稀奇古怪的名字。

今天楼上一直在装修,凿墙之声,此起彼伏,声声入耳无法逃避。忽高忽低,捉摸不定。搞得心情也是十五只水桶,甚为不爽。为了保证写作质量,就先写到这里。

欲知后事如何,点个star,订阅一下。