Go 规范与标准库
概述
参考:
Go 是一种通用语言,专为系统编程而设计。它是一种强类型且自带垃圾回收功能的语言,并具有显式支持并发编程的能力(称为 goroutine)。Go 程序由 Packages(包) 构建,其属性允许有效得管理依赖关系。
- Go 语言参考描述了 Go 语言的具体语法和语义
- Go 标准库则是与 Go 语言一起发行的一些可选功能,以便人们可以从一开始就轻松得使用 Go 进行编程。
Keywords
参考:
Go 语言非常简单,只有 25 个关键字(Keywords)可以使用,记住这 25 个关键字,就掌握了最基本的 Go 语言用法。这些关键字是 go 语言保留的,不能用作标识符
关键字在编程语言中是指该语言的一个功能,比如下文面的 var,就是指声明一个变量,func 就是定义一个函数等等。
Note: if-else 算两个关键字所以在这里一共只写了 24 个。
- break # 控制结构
- case # 控制结构
- chan # 用于 channel 通讯
- const # 语言基础里面的常量申明
- continue # 用在 for 控制结构中,用以忽略本次循环的后续所有逻辑,执行下一次循环
- default # 控制结构
- defer # 用于在函数退出之前执行某语句的功能
- fallthrough # 控制结构
- for # 控制结构
- func # 用于定义函数和方法
- go # 用于并发
- goto 控制结构
- if-else # 控制结构
- import 用于定义该文件引用某个包
- interface # 用于定义接口
- map # 用于声明 map 类型数据
- package # 用于定义该文件所属的包
- range # 用于读取 slice、map、channel 数据
- return # 用于从函数返回。有时候也用来直接跳出当前函数,回到主程序继续执行
- select # 用于选择不同类型的通讯
- struct # 用于定义抽象数据类型
- switch # 控制结构
- type # 用于 Type Declarations(类型声明),有两种形式:
- Definitions(定义) 自定义类型
- Declarations(声明) 一个类型的别名。
- 其实所谓的类型的别名,也可以当作一种自定义的类型。
- var # 用于 Declarations(声明) 变量
Lexical elements(词汇元素)
一些 Go 语言中抽象或具象名词,用于描述某些实体或行为。
Identifier
Identifier(标识符) 是一个抽象的概念,代表已命名的实体(e.g. Variable、自定义的 Data type、etc.)。Identifiers 由一个或多个字母和数字组成,Identifier 的第一个字符必须是字母。
有一些 Indentifiers 是 predeclared(预先声明的)(e.g. int, int8, rune, true, false, append, print, new, etc.)这些预声明的 Identifier 是一种类似 Keywords 的存在,可以是 类型、常量、零值、函数.
Tips: 随着 Go 语言版本的迭代,会逐渐加入一些新的预声明 Identifier(e.g. 用于快速比较获取最大值/最小值的 max, min 内置函数是在 1.21 版本加入的;1.21 版本后,删除数组中的元素也有了可以直接使用的 slices.Delete() 方法;etc.)
Notation(表示法)
Go 语言的语法遵从 EBNF 表示法
Block(块)
Block(块) 是由一对 {}(大括号) 括起来的一系列声明和语句。Block 可以是空。
除了显式的 Block 外,Go 语言还存在 implicit block(隐式块)
Block 的用法会直接影响 scoping(作用域)
implicit block(隐式块)
- universe block(全域块) # universe block 代表所有 Go 源代码文本。Notes: 这里的所有指编译时用到的所有 Go 文件。
- package block(包块) # 每个 Package 有一个 package block,是包含该包的所有 Go 源代码文本
- file block(文件快) # 每个文件都有一个_文件块_(file block),包含该文件中的所有 Go 源代码文本。
- 每个"if"、“for"和"switch"语句都被视为处于其自己的隐式代码块中。
- “switch"或"select"语句中的每个子句都作为一个隐式代码块。 代码块可以嵌套,并影响作用域。
Declarations and scope(声明与范围)
https://go.dev/ref/spec#Declarations_and_scope
这部分是介绍作用域的,用来定义各种 Identifier 是否可以被引用、是否可以被使用
exported and unexported(导出与未导出)
https://go.dev/ref/spec#Exported_identifiers
Note: uppercase(大写) 或 lowercase(小写)
Identifier 可以被 exported(导出) 以允许其他包访问 ta。当满足以下条件时,Identifier 将被导出:
- Identifier 名称的第一个字符是 uppercase letter(大写字母)
- Identifier 必须在 package block 中声明。在其他地方声明的均不会被导出。
- Note: package block 是一种 implicit block(隐式块)
Go 标准库
参考:
Go Standard Library(Go 标准库) 是 Go 内置 Package(包) 的集合,每个 package 都可以实现一类功能。每个 package 里有他们对应的常量、变量、函数、方法等。每个库就是一类功能,比如 bufio 库,这里面就是关于实现读写功能的各种内容;而 fmt 库则是关于实现格式化输入输出等功能。在这里可以看到 go 语言 原生支持的所有标准库。
与 标准库 相对应的就是 Go 第三方库 ,第三方库一般属于由个人开发,实现更多丰富功能的库。在 Go.dev可以搜索自己想要使用的所有库。
Go.dev 是 golang.org 的配套网站。 Golang.org 是开源项目和发行版的所在地,而 go.dev 是 Go 用户的中心,可从整个 Go 生态系统中提供集中和精选的资源。还可以在专门的标准库页面看到所有标准库下的 Go 内置包。
Go.dev 提供:
- 在 index.golang.org 上发布的 Go 软件包和模块的集中信息。
- 基本学习资源
- 关键用例和案例研究
Go.dev 当前处于 MVP 状态。我们为自己的建设感到自豪,并很高兴与社区分享。我们希望您能在使用 go.dev 的过程中找到价值和乐趣。 Go.dev 只有一小部分我们打算构建的功能,我们正在积极寻求反馈。如果您有任何想法,建议或问题,请告诉我们.
反馈
此页是否对你有帮助?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.