文章目录

  • 一、基础知识:
  • 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语言特性:

Go语言核心编程 pdf go语言核心编程完整版pdf_Go

Go语言核心编程 pdf go语言核心编程完整版pdf_标识符_02

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种整数类型, 其中byteuint8的别名; 不同类型的整型必须进行强制类型转换;

5.3 浮点型:

  • 浮点数字面量被自动推断为float64
  • 高精度科学计算用该使用math标准库;

5.4 复数类型:

var v = complex(2.1, 3)	// 构造一个复数
a := real(v)	// 返回复数实部
b := real(v)	// 返回复数虚部