脱掉Golang的第一层衣裳

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

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

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

Golang的程序结构

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

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

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

1. package main

2. import "fmt"

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

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

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

方法一:逐行import
import fmt
import log
import net/http

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

import (
    "io/ioutil"
    "log"
    "time"
)

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

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

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

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

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

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

--- 我是声明方式一 ---
var 变量名 变量类型

--- 我是声明方式二 ---
变量名 := 变量类型

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

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

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

obj1 := Object{
    xxxx:xxxx,
    yyyy:yyyy,
}

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

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

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

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

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

Golang的基本语法

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

Golang 关键字
break default func interface select
case defer Go map Struct
chan else Goto package Switch
const fallthrough if range Type
continue for import return Var

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

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

var age int

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

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

一个标识符必须以字母a到Z或a到Z或一个下划线开头,后面跟着零或更多的字母、下划线和数字(0到9)。

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

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

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

results matching ""

    No results matching ""