名称
知识点:
- go中函数、变量、常量、类型、语句标签和包的名称遵循一个简单规则:名称开头是一个字母或下划线
- go中的25个关键字
- 三十几个内置预声明的常量
- 实体第一个字母决定其可见性是否跨包,大写开头的是可导出的,小写开头是不可导出的
- 单词组合命名使用“驼峰式”,首字母缩写词通常使用相同的大小写
声明
知识点:
- 4个主要的声明:变量(var)、常量(const)、类型(type)、函数(func)
- 每一个.go文件已package声明开头,表明文件属于哪个包,随后是import声明,然后是包级别的类型、变量、常量和函数的声明,
- 变量声明通用形式:var name type = expression,type和expression部分可以省略,但不能都省略。
- 短变量声明,name := expression,短变量声明不需要声明所有在左边的变量,如果一些变量在同一个词法块中已经声明了,那么对于这些变量等同于赋值操作
指针
知识点:
- 变量声明 var x int,则表达式 p := &x(x的地址)获得一个指向该变量的指针p,而*p获得变量的值
- 指针类型的零值是nil,只有两个指针指向同一个变量,或都是nil时才相等
new 函数
知识点:
- new(T)表达式为创建一个未命名的T类型变量
- new创建的变脸和取其地址的普通局部变量相同,只是不需要引入一个虚拟的名字。
变量的生命周期
知识点:
- 生命周期指程序执行过程中变量存在的时间段,包级别变量的生命周期是整个程序的执行时间
- x一定使用堆空间,在函数f返回后还可以从global变量访问,x从f中逃逸
- 长生命周期对象中保持短生命周期对象不必要的指针,会阻止垃圾回收器回收短生命周期的对象空间
赋值
知识点:
- 多重赋值:
- 当一个赋值语句使用函数调用时,左边的变量个数需要和函数返回值一样多
- 赋值语句是显示赋值,程序中还有很多隐式赋值,如函数调用传参,return语句
- 任何比较中,第一个操作数相对于第二个操作数的类型必须是可赋值的
类型声明
知识点:
- type声明定义一个新的命名类型,它和某个已有类型使用相同底层类型,语法: type name underlying-type
- 对于每个类型T,都有一个对应的类型转换操作T(x)将x转换为类型T,如果两个类型具有相同的底层类型或二者都是指向相同底层类型变量的未命名指针类型,则二者是可以相互转换的
- 命名类型的底层类型决定了它的结构和表达方式,以及它支持的内部操作集合
- 不同命名类型即使有相同的底层类型也不能直接比较,
包和文件
知识点:
- go语言中包的作用和其他语言中的库或模块的作用类似,用于支持模块化、封装、编译隔离和重用
- 包导入的路径就是包所在目录名的尾部
- 每一个包给它的声明提供独立的命名空间
- 从包外部引用包内函数必须提供明确修饰符来指明是哪个包的函数,例如image.Decode和utf16.Decode
- 一个导入路径标注一个目录,目录中包含构成包的一个或多个Go源文件。包名匹配导入路径的最后一段
- 导入声明可以设定一个可选的名字来避免冲突
- 如果导入一个没有被引用的包,就会触发一个错误
包初始化
知识点:
- 包初始化从初始化包级别的变量开始,这些变量按照声明顺序初始化,在依赖已解析完毕的情况下,根据依赖顺序进行,如果包由多个.go文件组成,初始化按照编译器收到文件的顺序进行,包的初始化按照程序中的导入的顺序进行,依赖顺序优先,每次初始化一个包。
作用域
知识点:
- 声明的作用域是指能够用到所声明的字段的源代码段
- 语法块是由大括号围起来的一个语句序列
- 包括语法块在内,所有声明代码统称为词法块
- 一个程序中的不同词法块中可以包含多个声明,