Go基础知识笔记

  1. 程序结构
    1. 命名
    2. 声明
    3. 变量
      1. 短变量声明
      2. 指针
      3. new函数
    4. 变量生命周期
      1. 逃逸

程序结构

命名

  • 函数、变量、常量、类型、语句标签、包 的命名规则:必须以字母或下划线开头

  • 若一个实体在函数中声明,它只对函数 局部有效。

    若声明在函数外,它将对包里面的所有源文件可见,其中:

    • 名称以大写字母开头,它是导出的,即它是 包外可见可访问的,例如: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/
目录
×

喜欢就点赞,疼爱就打赏