Go基础知识笔记
程序结构
¶命名
-
函数、变量、常量、类型、语句标签、包 的命名规则:必须以字母或下划线开头
-
若一个实体在函数中声明,它只对函数 局部有效。
若声明在函数外,它将对包里面的所有源文件可见,其中:
- 名称以大写字母开头,它是导出的,即它是 包外可见可访问的,例如:fmt.Println
-
包名称总是由小写字母组成
-
遇到由单词组合成的名称时,使用驼峰命名风格。
¶声明
声明即给一个程序实体命名,并且设定其部分或全部属性。
四种主要的声明:
- 变量(var)
- 常量(const)
- 类型(type)
- 函数(func)
每一个文件以 package 声明开头,表示该文件术语哪个包。然后是 import 声明。
¶变量
var 声明创建一个具体类型的变量,然后为他命名,设置初始值,通用格式:
var name type = expression
类型和表达式可以省略其中之一,但不能都省略。
- 若类型省略,其类型将由初始化表达式决定
- 若表达式省略,其初始值为对应类型的 零值 (数字:0,布尔:false,字符串:“”,接口及应用:nil)
可以声明一个变量列表,并选择使用对应的表达式列表对其初始化:
var i, j, k int
var b, f, s = true, 2.222, "four"
变量可通过接收函数返回值进行初始化
var f, err = os.Open(name) // 返回一个文件和一个错误
¶短变量声明
作用于函数当中,声明和初始化局部变量,形如 name := expression
可声明并初始化多个变量:
// 声明
i, j := 1, 0
// 交换
i, j = j, i
对于多变量情况,短变量声明可包含已声明变量(仅对其赋值),但至少声明一个新的变量,否则代码无法编译通过。
¶指针
指针是某个变量的地址,一个指针指示变量所保存位置。具体不多解释和C语言差不多。
指针的零值为 nil
¶new函数
另一种创建变量的方式为使用内置的 new 函数。表达式 new(T) 创建一个未命名的 T 类型变量,初始化为 T类型的零值,并返回其地址(地址类型为 *T)
p := new(int)
fmt.Println(*p) // 输出0
*p = 2
fmt.Println(*p) // 输出2
¶变量生命周期
Go 和 Java 一样,提供了自动的垃圾回收。生命周期指的是程序执行过程中变量存在的时间段。
-
包级别变量的生命周期是整个程序的执行时间
-
局部变量有一个动态的生命周期:每次执行声明语句时创建一个新的实体,变量一直存活到它不可访问,届时它所占据的存储空间将被回收
垃圾回收器以每一个包级别变量、每一个当前执行函数的局部变量为 GC Root ,进行可达性分析。不可达的全部都得死。
编译器可以决定使用堆或者栈上的空间来为变量分配空间。
¶逃逸
var global *int
func f(){
var x int
x = 1
global = &x
}
func g(){
y := new(int)
*y = 1
}
在这个例子中,x 一定使用堆空间,因为它在 f 函数返回以后还可以从 global 变量访问,尽管它被声明为一个局部变量。这种情况我们称之为:x 从 f 中逃逸。
而在 g 函数中,变量 *y 变得不可再访问,可回收,所以编译器可以安全地再栈上分配 *y 。
未完待续…
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,邮件至 708801794@qq.com
文章标题:Go基础知识笔记
文章字数:929
本文作者:梅罢葛
发布时间:2020-11-07, 16:31:54
最后更新:2020-11-26, 16:13:32
原始链接:https://qiurungeng.github.io/2020/11/07/Go%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86%E5%AD%A6%E4%B9%A0/