文章目录
- 一、基础知识:
- 1. 语言简介:
- 1.2 语言特性:
- 1.3 Go语言特性:
- 2. 初识 Go 程序:
- 3. Go词法单元:
- 3.1 token:
- 3.2 标识符:
- 3.3 操作符和分隔符:
- 3.4 字面常量
- 3.5 总结:
- 4. 变量与常量:
- 4.1 变量:
- 4.1.1 声明方式:
- 4.1.2 变量属性:
- 4.2 常量:
- 5. 基本数据类型:
- 5.1 布尔类型:
- 5.2 整型:
- 5.3 浮点型:
- 5.4 复数类型:
一、基础知识:
1. 语言简介:
1.2 语言特性:
常见高级语言的语言特性:
语言组织:
所有的高级语言都是用源代码来表达程序, 程序的语法格式千差万别, 但是表达这些语法的基本概念大同小异, 主要包括:
- 标识符和关键字;
- 变量和常量;
- 运算符;
- 表达式;
- 简单语句;
- 控制结构;
类型系统:
每种高级语言都有自己的类型系统, 类型系统的特性主要表现为以下几个方面:
- 动静特性: 动态语言还是静态语言;
- 类型强弱: 强类型还是弱类型;
- 基本数据结构: 包括类型及其支持的运算和操作集合;
- 自定义数据类型: 包括类型及其支持的运算和操作集合;
抽象特性:
- 函数: 是否支持函数, 匿名函数, 高阶函数, 闭包等;
- 面向对象: 是否支持面向对象;
- 多态: 如何支持多态;
- 接口: 是否支持接口, 以及接口实现模式;
元编程特性:
- 泛型: 是否支持泛型;
- 反射: 是否支持反射, 反射的能力;
运行和跨平台语言特性:
- 编译模式: 是编译成可执行文件, 还是编译成中间代码, 还是解释器解释执行;
- 运行模式: 直接由os加载运行, 还是虚拟机加载执行;
- 内存挂你: 是否支持GC;
- 并发支持: 是否原生支持并发, 还是库支持;
- 交叉编译: 是否支持交叉编译;
- 跨平台支持: 是否支持多个平台;
语言软实力特性:
- 库: 标准库和第三方库是否丰富, 好用, 高效;
- 框架: 是否有非常出众的框架;
- 语言自身兼容性: 语言规范是否经常变换, 语言新版本向前兼容性;
- 语言影响力: 是否有商业公司支持, 社区的活跃性, 是否是著名项目;
1.3 Go语言特性:
2. 初识 Go 程序:
hello .go
package main
import "fmt"
func main() {
fmt.Printf("Hello, world, 你好,世界!\n")
}
Go源代码特征解读:
- 源程序以".go"为后缀;
- 源程序默认为UTF-8编码;
- 标识符区分大小写;
- 语句结尾的分号可以省略;
- 函数以
func
开头, 函数体开头{
必须在函数头所在的行尾部, 不能让单独一行; - 字符串字面量使用
""
(双引号)括起来; - 调用包里面的方法通过
.
访问符, 例如fmt.Printf
- main函数所在的包名必须是
main
;
3. Go词法单元:
现代高级语言的源程序内部的几个概念:
token、关键字、标识符、操作符、分隔符和字面量;
3.1 token:
token是构成源程序的基本不可分割单元. 编译器编译源程序的第一步就是将源代码分割为一个个独立的token, 这个过程就是词法分析;
go语言的token可以分为: 关键字、标识符、操作符、分隔符和字面量;
token:
- identifiers(标识符):
- Predeclared identifiers(预声明标识符):
- keywords(关键字)
- 其他预声明标识符:
- 内置数据类型标识符
- 常量值标识符;
- 空白标识符;
- 内置函数;
- 用户自定义标识符:
- 包名;
- 变量名;
- 常量名;
- 函数名;
- 自定义类型名;
- 方法名;
- operators and delimitersI(操作符和分隔符):
- 操作符:
- 不但起到分隔token的作用, 本身也是一个token;
- 纯分隔符: (仅仅起到分隔token作用, 本身不是token)
- 空格;
- 制表符
- 回车
- 换行
- literals(字面常量):
- 整数字面量;
- 浮点型字面量;
- 复数类型字面量;
- 字符串字面量;
- 字符型字面量;
go的token分隔符有两类:
- 操作符;
- 自身没有特殊含义, 仅用来分隔其他token, 被称为纯分隔符
3.2 标识符:
标识符: 用来标识变量, 类型, 常量等语法对象的符号名称, 其在语法分析时作为一个token存在;
总体分类:
- 语言设计者预留的标识符;
- 编程者可以自定义的标识符;
Go语言的预声明标识符:
关键字:
共35个关键字, 可分为3类:
- 引导程序整体结构:
关键字 | 说明 |
package | 定义包名 |
import | 导入包名 |
const | 常量声明 |
var | 变量声明 |
func | 函数定义 |
defer | 延迟执行 |
go | 并发语法糖 |
return | 函数返回 |
- 声明符合数据结构:
关键字 | 说明 |
struct | 定义结构体 |
interface | 定义接口 |
map | 声明或创建map类型 |
chan | 声明或创建通道类型 |
- 控制结构:
关键字 | 说明 |
if … else … | if…else语句 |
for、range、break、continue | for循环 |
switch、select、type、case、default、fallthrough | switch和select语句 |
goto | goto跳转语句 |
- 内置数据类型标识符:(20个)
- 数值:
- 整数:
-
byte、int、int8、int16、int32、int64
; -
uint、uint8、uint16、uint32、uint64、uintprt
;
- 浮点型:
float32、float64
- 复数型:
complex64、complex128
- 字符和字符串
string、rune
- 接口:
error
- 布尔:
bool
- 内置函数:
内置函数也是高级语言的 种语法糖, 全局可见性;
关键字 | 说明 |
make() | 申请内存,创建实例 |
new() | 创建对象 |
len() | 长度 |
cap() | 容量 |
append() | list追加 |
copy() | 从切片中复制数据 |
delete() | 删除 |
panic | 抛异常 |
recover() | 捕获异常(宕机恢复) |
close() | 上下文关闭 |
complex() | 构建复数 |
real() | 复数实部 |
image() | 复数虚部 |
print() | 打印 |
println() | 打印并换行 |
- 常量值:
关键字 | 说明 |
true, false | bool常量 |
iota | 连续枚举值 |
nil | 指针/引用的默认值 |
- 空白标识符:
关键字 | 说明 |
| 表示匿名变量, 通常用作左端占位符 |
3.3 操作符和分隔符:
算术运算符
位运算符
赋值和赋值复合运算操作
比较运算符
括号
逻辑运算符
自增自减
其他
3.4 字面常量
整型字面量
浮点型字面量
复数类型字面量
字符型字面量
字符串字面量
3.5 总结:
- 关键字引导程序的基本结构;
- 内置类型标识符辅助声明变量与常量;
- 字面量辅助变量和常量的初始化;
- 分隔符帮助Go编译器识别各个token;
- 操作符和变量、关键字一起构成丰富的语法单元;
4. 变量与常量:
4.1 变量:
4.1.1 声明方式:
显式的完整声明:var varName dataType [ = value ]
说明:
- 关键字
var
用于变量声明; -
varName
是变量名标识符; -
dataType
是Go数据基本类型; -
value
是变量的初始值, 可以是字面量, 可以是其他变量名,也可以是表达式; 如果没有初始值, 则为默认值; - Gode 变量声明后会立即为其分配空间;
短的声明varName := value
-
:=
声明只能出现在函数(方法)内; - 此时Go编译器自动进行数据类型推断;
多个类型变量同时声明:a, b := 1, "hello"
4.1.2 变量属性:
- 变量名:
- 遵循关键字规则;
- 变量值:
- 指向的是地址中存放的值;
- 变量存储和声明周期:
- Go提供自动内存管理;
- 编译器使用栈逃逸技术自动分配空间;
- 类型信息
- 可见性与作用域;
4.2 常量:
常量使用一个名称来绑定一块内存地址, 该地址中存放的内容不可改变; 常量存储在程序的**只读段(.rodata section)**里;
预声明标识符iota
用在常量声明里, 其初始值为0; 一组多个常量同时声明时其值逐行增加, iota
可以看做自增枚举变量, 专门用来初始化常量;
// 类似枚举的iota
const (
c0 = iota // c0 = 0
c1 = iota // c0 = 1
c2 = iota // c0 = 2
)
// 简写模式
const (
c0 = iota // c0 = 0
c1 // c0 = 1
c2 // c0 = 2
)
// 注意iota逐行增加
const (
a = 1 << iota // a = 1 (iota = 0)
b = 1 << iota // b = 1 (iota = 1)
c = 3 // c = 3 (iota = 2, unused)
d = 1 << iota // d = 8 (iota = 3)
)
// 分开的const语句, iota每次从0开始
const x = iota // x = 0
const y = iota // y = 0
5. 基本数据类型:
Go是一种强类型的静态编译语言, 类型是高级语言的基础, 有了类型, 高级语言才能对不同类型抽象出不同的运算;
5.1 布尔类型:
5.2 整型:
内置12种整数类型, 其中byte
是uint8
的别名; 不同类型的整型必须进行强制类型转换;
5.3 浮点型:
- 浮点数字面量被自动推断为
float64
- 高精度科学计算用该使用
math
标准库;
5.4 复数类型:
var v = complex(2.1, 3) // 构造一个复数
a := real(v) // 返回复数实部
b := real(v) // 返回复数虚部