很长一段时间没有写新的文章了,主要是因为最近的工作真的特别特别忙。早上六点过起床,七点钟之前出门,到工作点九点。我们是997工作制,也就是早上九点上班,晚上九点下班,每周工作7天(没错,没得休)。再加上通勤需要两个·小时左右,所以晚上到家也十一点过了,到家只能立马洗漱睡觉,第二天早上六点又起床去搬砖。
连续干了半个月,今天实在受不了,请了一天假,在家休息休息,顺便学习一下Golang。
因为每天上下班通勤需要四个小时的时间,并且大部分时间都在地铁上。所以我利用上下班的时间自己跟着菜鸟教程大概学了一遍。
第一次接触Go
先说说我自己对Go的印象。在学习hello world的时候我就觉得Go的语法挺奇怪的。
1 2 3 4 5 6 7 | package main import "fmt" func main() { fmt.Println("Hello, World!") } |
package和import有点像Java,这个我倒是能理解。不过import后面的fmt带引号还蛮有意思的,印象中没有在其他语言中看到过类似,不是到是不是跟C语言里的 #include "filename.h" 是一个道理。其次就是fmt这个缩写,相较于其他我学过的语言的I/O操作,倒是没有见过标准库缩写成fmt的...
还有一点我挺喜欢的,就是左括号不能单独作为一行,比如下面这段代码是错误的:
1 2 3 4 5 6 7 8 9 | import ( /* 这样不行 */ "fmt" ) func main() { /* 这样也不行 */ } |
因为我自己习惯就是括号跟在前一个语句的后面,不单独占一行,所以对我没什么影响。不过这个”特性“对于习惯括号单占一行的同学来说估计就比较恼火了。
不过这都不重要,多写写习惯就好了...其他还有一些地方与我经常使用的语言有些不同,后面详细说说。
直接开始吧!
由于这个系列不是教程系列,主要是做一些我自己学习时的笔记,所以可能有些部分与大多数编程语言一样的就不会单独拿出来讲了。只讲讲Go与其他语言有较大不同的地方,或者只有Go有的特性。
基础语法
跳过Go语言介绍和环境安装和程序运行的部分,以上面的Hello world部分的代码为例,先从程序结构与入手。
跟我上面所说的一样,左括号不能单独放在一行,否则会提示syntax error: unexpected semicolon or newline before {,还有一点与其他语言不大一样的是import,首先import的包需要使用引号括起来,以字符串的形式存在。其次import支持使用括号的方式,一次导入多个包。
数据类型
Go里面的数据类型也可以分成几个大类,分别为布尔型、数字型、字符串型和其他类型。
- 首先是布尔型,与其他语言类似,有且仅有true和false两种,这个就不过多介绍了。
- 字符串型:在Go语言中,使用""来定义字符串。在Go中,同样也支持类似于\n、\t这样的转义符。如果需要多行字符串,不仅可以通过\n实现,也可以使用`符号(反引号,1旁边的那个)。
- 数字型:Go不仅支持基础的 int 和浮点型 float32、float64,还支持uint8、uint16、uint32、uint64、int8、int16、int32、int64这种指定符号和大小的基于架构的类型。更详细的内容可以在这里找到。
- 其他类型:包括:指针类型(Pointer)、数组类型、结构化类型(struct)、Channel 类型、函数类型、切片类型、接口类型(interface)、Map 类型等。
变量定义
Go变量可以使用var来定义,比如var aaa int = 1 或者不指定初始值,var bbb int 如果指定了初始值,则可以省略类型,如var ccc = 1。比较特殊的是,Go也可以使用:=运算符来定义变量,并且使用:=来定义变量不用指定数据类型,但仅限于定义未初始化(包括定义但未初始化)过的变量,如下代码:
1 2 3 4 5 | /* 使用这一句来定义变量abc,并且自动指定类型 */ abc := 123 /* 对于已经定义过的变量,则不能再使用这个运算符 */ abc := 456 // 再次定义abc会报错 |
同时也可以对多个变量进行定义,下面代码中的写法都是合法的:
1 2 3 4 5 6 7 8 9 10 11 12 | var a, b, c int var d, e = 1, 2 x, y := 22, "测试" var ( i int; j int; ) /* 交换变量值,前提是两个变量类型一致 */ a, b = b, a |
使用const关键字以修饰常量类型,比如:
1 2 3 4 5 6 7 | const a, b, c = 1, 2, 3 const ( /* 这个例子来自菜鸟教程,常量可以用来枚举 */ Unknown = 0 Female = 1 Male = 2 ) |
还有一个比较特殊的iota,再const中,每新增一行常量声明,iota计数一次,如下(来自菜鸟教程,这一块就不细说了,如果后面会用到再单独介绍):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package main import "fmt" func main() { const ( a = iota //0 b //1 c //2 d = "ha" //独立值,iota += 1 e //"ha" iota += 1 f = 100 //iota +=1 g //100 iota +=1 h = iota //7,恢复计数 i //8 ) fmt.Println(a,b,c,d,e,f,g,h,i) } // 结果为 0 1 2 ha ha 100 100 7 8 |
今天就先到这儿,主要是一些比较基础的内容中与其他语言不大一样的内容,下一章讲讲运算符、分支和循环语句。