标识符
标识符用来表示 Go
中的变量名、函数名、类型名、包名等,以字母或 _
开头,后面跟任意数量的字母、数字或 _
,区分大小写。
_
是一个特殊的标识符:空白标识符,同样可以用于变量声明或赋值,但任何赋予此标识符的值会被丢弃,不能在后续使用,常用来丢弃接收值。
为什么会有标识符呢?因为我们要操作的数据存放在内存中,如果直接操作内存地址,可读性会非常差,所以用标识符来表示相应的内存地址,这也就是我们常说的变量。
关键字
关键字是 Go
预先定义好的,有特殊含义的标识符。关键字不能用于自定义名字,只能在特定语法结构中使用。
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
复制代码
预定义标识符
预定义标识符并不是关键字,可以使用它们作为变量,但为了不引起混乱,不建议这么做。
内建常量: true false iota nil
内建类型: int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
float32 float64 complex128 complex64
bool byte rune string error
内建函数: make len cap new append copy close delete
complex real imag
panic recover
复制代码
注释
- 单行注释:
//
- 多行注释:
/*
*/
程序的一般结构
Go
程序的结构并没有强制要求,但为了更好的阅读体验,总体设计思路如下:
import
包之后,定义或声明常量、变量和类型。- 如果存在
init
函数的话,则对该函数进行定义(这是一个特殊的函数,每个含有该函数的包都会首先执行这个函数)。 - 如果当前包是
main
包,则定义 main 函数。 - 定义其余的函数,首先是类型的方法,接着是按照
main
函数中先后调用的顺序来定义相关函数,如果有很多函数,则可以按照字母顺序来进行排序。
Go
程序的执行顺序如下:
- 按顺序导入所有被
main
包引用的其它包,然后在每个包中执行如下流程 - 如果该包又导入了其它的包,则从第一步开始递归执行,但是每个包只会被导入一次。
- 然后以相反的顺序在每个包中初始化常量和变量,如果该包含有
init
函数的话,则调用该函数。 - 在完成这一切之后,
main
也执行同样的过程,最后调用main
函数开始执行程序。
package main
import "fmt"
func main() {
fmt.Println("hello, world")
}
复制代码
#3# 声明包
必须在源文件中非注释的第一行指明这个文件属于哪个包,每个 Go
文件都属于且仅属于一个包,一个包可以由许多以 .go
为扩展名的源文件组成。
导入包
- 如果包名以
/
开头(包括Windows
下),会在系统的绝对路径中查找包 - 如果包名不是以
.
或/
开头,会在全局文件进行查找 - 如果包名以
./
开头,则会在相对目录中查找
导入多个包;
import "fmt"
import "os"
复制代码
或者
import "fmt"; import "os"
复制代码
或者
import (
"fmt"
"os"
)
复制代码
或者
import ("fmt"; "os")
复制代码
如果导入了一个包却没有使用它,则会在构建程序时引发错误,这正是遵循了
Go
的格言:“没有不必要的代码!“。