本文内容基于《Go语言核心编程》,李文塔著。
1 基础知识
1.1 语言简介
1.1.1 Go语言的诞生背景
- 当前编程语言对兵法的支持不是很好,不能很好地发挥多核CPU的威力;
- 程序规模越来越大,编译速度越来越慢;
- 现有的编程语言设计越来越复杂,某些特性的实现不怎么优雅。
1.1.2 Go语言的特性
特性集合 | 特性项 | Go | C | Java |
基础语法 | 关键字和保留字 | 25个 | ANSI 32个 | 大于48个 |
控制结构 | 支持顺序、循环、分支 | 支持顺序、循环、分支 | 支持顺序、循环、分支 | |
类型系统 | 动、静特性 | 静态语言,支持运行时动态类型 | 静态语言 | 静态语言 |
强、弱特性 | 强类型 | 弱类型 | 强类型 | |
隐式类型推导 | 支持 | 否 | 否 | |
类型安全 | 类型安全 | 非类型安全 | 类型安全 | |
自定义数据类型 | 支持type自定义 | struct | 通过类/接口实现自定义类型和行为 | |
抽象 | 函数 | 支持 | 支持 | 支持 |
面向对象支持 | 类型组合支持面向对象 | struct内嵌函数指针支持 | 类/接口 | |
接口 | Duck模型 | void*间接支持 | 显式声明 | |
多态 | 通过接口支持 | void*间接支持 | 接口及继承关系支持 | |
元编程 | 泛型支持 | 无 | 无 | 有 |
反射支持 | 有 | 无 | 有 | |
平台和运行模式 | 编译模式 | 编译成可执行程序 | 编译成可执行程序 | 编译成中间字节码 |
运行模式 | 直接运行 | 直接运行 | 虚拟机加载执行 | |
内存管理 | 支持自动垃圾回收 | 手动管理 | 支持自动垃圾回收 | |
并发支持 | 协程(语言原生支持) | OS线程(库支持协程) | Java线程(JVM内部映射到OS线程) | |
交叉编译 | 支持 | 支持 | 中间代码无交叉编译必要 | |
跨平台 | 支持 | 支持 | 原生跨平台 | |
语言软实力 | 标准库和第三方库 | 丰富,发展很快 | 很丰富 | 很丰富 |
框架 | 丰富,发展很快 | 很丰富 | 很丰富 | |
语法兼容性 | 向前兼容性好 | 向前兼容性好 | 向前兼容性好 | |
影响力 | 社区活跃,Google背书 | 40多年宝刀未老 | 社区活跃,近几年受Oracle控制 | |
应用领域 | 云计算基础设施软件、中间件、区块链 | OS及系统软件 | 企业级应用、大数据、移动端 |
1.2 初始Go程序
- hello.go
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
- 编译
go build hello.go
- 运行
./hello
1.3 Go语法单元
- iota:用在连续的枚举类型的声明中
- 操作符:不但起到分隔token的作用,本身也是一个token,如:=、+等
- 分隔符:仅仅起到分隔token的作用,本身不是token
1.4 变量和常量
1.4.1 变量
变量使用一个名称来绑定一块内存地址,该内存地址中存放的数据类型由定义变量时指定的类型决定,该内存地址里面存放的内容可以改变,Go的基本类型变量声明有两种:
- 显式的完整声明
var varName dataType [= value]
// 如果不指定初始值,Go默认将该变量初始化为类型的零值
// Go的变量声明后就会立即为其分配空间
var a int = 1
var a int = 2 * 3
var a int = b
- 短类型声明
varName := value
// 只能出现在函数内(包括方法内)
// Go编译器自动进行数据