第4章:基本结构和基本数据类型
go的源文件是以.go结尾,文件名不能包含空格和其它特殊字符,不过可以用_下划线
代码区分大小写也没什么好说的,来记下标识符的注意事项
有效的标识符必须以字符(可以使用任何 UTF-8 编码的字符或 _ )开头,然后紧跟着 0 个或多个字符或 Unicode 数字
比如:X56,group1,_x23,i,өԑ12
几个不行的例子
以下是无效的标识符:
1ab(以数字开头),case( Go 语言的关键字),a+b(运算符是不允许的)
go的25个关键字或保留字
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 |
go还有36个预定义标识符,代表一些基本类型和函数
append | bool | byte | cap | close | complex | complex64 | complex128 | uint16 |
copy | false | float32 | float64 | imag | int | int8 | int16 | uint32 |
int32 | int64 | iota | len | make | new | nil | panic | uint64 |
println | real | recover | string | true | uint | uint8 | uintptr |
包的概念、导入与可见性
每个 Go 文件都属于且仅属于一个包,并且在源文件中非注释的第一行指定包名,几个go文件可以在一个包中,因些包名和文件名也不用相同,
main包比较特殊 package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main
的包
go的编译过程比较特别
Go 中的包模型采用了显式依赖关系的机制来达到快速编译的目的,编译器会从后缀名为 .o
的对象文件(需要且只需要这个文件)中提取传递依赖类型的信息。
如果 A.go
依赖 B.go
,而 B.go
又依赖 C.go
:
- 编译
C.go
,B.go
, 然后是A.go
. - 为了编译
A.go
, 编译器读取的是B.o
而不是C.o
.
这种机制对于编译大型的项目时可以显著地提升编译速度。
可以通过import关键字来导入一个包,使用方式有以下几种
import "fmt"
import "os"
import "fmt"; import "os"
import (
"fmt"
"os"
)
import ("fmt", "os")
注意,如果包名不是以.或/开头,go会重全局文件中查找,如“fmt”,“aaa/bbb”如果以./开头,go会在相对目录中查找,如果只以/开头会重绝对路径中查找
go的可见性规则相当简单 ,如果以大写字母开头(函数,变量等 ),则其它包可见,小写则相当于该包私有吧
导入包时也可以起别名哦 如:import fm "fmt" 则后面可以用fm来当fmt了
声名在import后的变量是包的全局变量
这里又讲解了go的函数,类型和注释,也挺简单 觉得没有什么 好记的了,因为用的多了,看起来就理所当然了
不过有几点可以注意下:
1.go不允许隐式的类型转换,
2.Go 程序的执行(程序启动)顺序如下:
- 按顺序导入所有被 main 包引用的其它包,然后在每个包中执行如下流程:
- 如果该包又导入了其它的包,则从第一步开始递归执行,但是每个包只会被导入一次。
- 然后以相反的顺序在每个包中初始化常量和变量,如果该包含有 init 函数的话,则调用该函数。
- 在完成这一切之后,main 也执行同样的过程,最后调用 main 函数开始执行程序。