脱掉Golang的第一层衣裳 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。因为mian表示整个函数的入口,所以golang替你规定好了,所有的函数入口一律叫做mian,写别的,对不起不认识。

最后还要记住一点,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,订阅一下。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏take time, save time

你所能用到的数据结构(七)

十、装配火车的乐趣       国庆放假结束了,第一天真是不想来上班啊,接着国庆之前的吧,上一篇写的是利用数组实现堆栈的结构,使用数组的两个致命的弱点是大小必须...

35880
来自专栏CDA数据分析师

那些容易被忽略的Python编程方式

Python 之禅 The Zen of Python, by Tim Peters Beautiful is better than ugly. 优美胜于丑陋...

222100
来自专栏magicsoar

关于字符编码的那些事

一、编码是什么 编码为了某种目的把信息从一种形式集合转换为另一种形式集合的过程,古时的鸣金收兵,从某种意义上讲也是一种编码,将帅发出了退兵的命令,为了让更多的人...

21860
来自专栏日常学python

python中一切皆对象

众所周知python是一款面向对象语言,在python语言中,可以说python的一切皆对象是不会错的。如果你学过java的话,你也会知道java也是一款面向对...

12800
来自专栏Java爬坑系列

【Java入门提高篇】Day1 抽象类

  基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍,仍不理解的部分...

23960
来自专栏喵了个咪的博客空间

zephir-(6)运算符

#zephir-运算符# ? ##前言## 先在这里感谢各位zephir开源技术提供者 了解的动态变量和静态变量之后我们今天来了解一下在编码工作中至关重要的运算...

37690
来自专栏Jed的技术阶梯

Java设计模式之多例模式

在介绍单例模式的时候,我们举的例子是皇帝,同一时期只能有一个皇帝,详情请看:Java设计模式之单例模式,但在个别情况下,同一时期还有两位皇帝!这种情况就出现在明...

11710
来自专栏Android知识点总结

看得见的数据结构Android版之表的数组实现(数据结构篇)

9610
来自专栏ml

java SE学习之线程同步(详细介绍)

       java程序中可以允许存在多个线程,但在处理多线程问题时,必须注意这样一个问题:               当两个或多个线程同时访问同一个变...

28250
来自专栏IT大咖说

程序员必知的 Python 陷阱与缺陷列表

阅读字数:3754 | 10分钟阅读 我个人对陷阱的定义是这样的:代码看起来可以工作,但不是以你“想当然“”的方式。如果一段代码直接出错,抛出了异常,我不认为这...

39270

扫码关注云+社区

领取腾讯云代金券