Go 学习笔记
The Go Programming Language
与其它语言的对比
Go | C/C++ | Java | Python | |
---|---|---|---|---|
内存管理 | GC | 手动管理 | GC | GC |
有无标准格式 | ✔️ | ❌ | ❌ | ❌ |
操作符重载 | ❌ | ✔️ | ❌ | ✔️ |
参数默认值 | ❌ | ✔️ | ❌ | ✔️ |
构造函数与析构函数 | ❌ | ✔️ | 仅构造函数 | ✔️ |
继承 | ❌ | ✔️ | ✔️ | ✔️ |
模板 | ❌ | ✔️ | ✔️ | ❌ |
异常 | ❌ | ✔️ | ✔️ | ✔️ |
宏 | ❌ | ✔️ | ❌ | ❌ |
隐式数值类型转换 | ❌ | ✔️ | ❌ | ✔️ |
注解 | ❌ | ❌ | ✔️ | ❌ |
Go 官方工具链
工具 go
- go run source-code.go
-
直接运行Go程序 - go build source-code.go
- 编译Go源代码
代码格式化工具 gofmt
Go 语法
package 包
类似于 Java 的 package,但不要求放在对应的目录中。一个包可以由多个源代码文件组成。
常用的包: - os
- 操作系统无关的函数及变量(类似 Python
的 os
) - fmt
- 输入输出(类似 C++
的iostream
)
导入包的语法
import fmt
- 导入单个包 fmt
1 |
|
fmt
和 os
编写语句
⚠️ 注意事项
- 和 Python 一样,每行一般无需分号,但是 如果一行内有多个语句则要加分号
- 大括号必须紧跟函数声明或 for 循环之后,不能换行
- 换行只能在操作符之后换行,不能在操作符前换行
变量声明
1 |
|
声明一个变量格式如上,首先用关键字 var
说明要声明的是变量,随后跟上变量名,最后指明其数据类型。
以该方式声明的变量会被赋初值,int
类型的会被赋值
0,bool
类型赋值 false
,string
类型则赋值 ""
。
Go 支持自动类型推导,故以下两个语句是等价的
1 |
|
1 |
|
也可以同时声明/初始化多个变量:
1 |
|
还有一种变量声明的方法,被称为短变量声明 (short variable
declaration),可以看作是一种语法糖,不需要添加关键字
var
,而是使用一个新的符号
:=
。需要注意的是,该种形式只能在函数内部充当局部变量,不能作为全局变量。
1 |
|
需要注意的是,:=
是声明,而 =
是赋值。因此使用 :=
时,必须至少有一个变量是语法块中新的变量;如果是一个已经被声明的变量,则其行为和赋值操作一样。
操作符
自增、自减操作符:++
、--
,只能在变量之后使用,不能前缀使用,也就是
c++
是合法的,但是 ++c
非法;使用这两种操作符时,语句仅仅只是个语句,而不是表达式,不能得到值,也就是
C/C++ 中的 j = i++
在 Go 中是非法的。
循环
Go 中循环只有一个,使用 for
关键字来定义,语法如下:
1 |
|
1 |
|
1 |
|
_
代替。
指针
和 C/C++ 一样,可以对某个对象使用取地址操作符
&
,对指针使用 *
操作符可以获取其指向的对象:
1 |
|
nil
,相当于 C++ 中的 nullptr
。由于 Go
不存在未被初始化的变量之说,故只声明一个指针而不赋值只会得到一个空指针。
Go 也提供了直接创建指针的机制,即使用 new(T)
函数。但是需要注意的是,其行为和对局部变量取地址是等价的,也就是下面两段代码等价:
1 |
|
1 |
|
内建数据类型
切片 slice
类似于数组,但是大小可以变化
创建方式:
1 |
|
映射 map
存储一系列的键值对,类似于 C++ 中的
std::unordered_map
创建方式:
1 |
|
遍历:
1 |
|
生命周期
Go 的 GC 回收策略
编译的诸限制
- 如果存在未被引用的包,则不能通过编译