Go程序设计语言读书笔记-第二章 - Go语言中文社区

Go程序设计语言读书笔记-第二章


第二章-程序结构

如果一个实体在函数中声明,只在函数局部有效。如果在函数外,对包里的所有源文件可见。实体第一个字母的大小写决定其可见性是否挎包。如果以大写字母开头,意味着对包外是可见和可访问的,可以被自己包之外的其他程序所引用,如:fmt包中的Printf。

声明:var name type = expression
短声明:name := expression name的类型由expression决定 在局部变量和初始化中主要使用短声明
短声明也可用来调用多个返回值的函数:如下:
f,err := os.Open(name)

指针:和C/C++类似,指针类型的零值为nil。

new函数:new(T)创建一个未命名的T类型变量,初始化为T类型的零值,并返回其地址(地址类型为*T)
// p:=new(int) *int类型的p,指向未命名的int变量
//fmt.Println(*p) 输出“0”

编译器可以选择使用堆或者栈上的空间来分配,令人惊奇的是,这个选择不是基于使用var或new关键字来声明变量。

		func f(){
			var x int
			x = 1
			global = &x
		}
		
		func g(){
			y := new(int)
			*y = 1
		}

这里,x一定使用堆空间,因为它在f函数返回以后还可以从global变量访问,尽管它被声明为一个局部变量。这种情况为x从f逃逸。相反,当g函数返回时,变量y变得不可访问,可回收。因为y没有从g中逃逸,所以编译器可以安全地在栈上分配*y,即便使用new函数创建它。任何情况下,逃逸的概念使你不需要费心来写正确代码,但在性能优化的时候有好处,因为每一次逃逸都需要一次额外的内存分配的过程。
垃圾回收对于写出正确代码有很大的帮助,但是免不了内存的负担。不需要显示分配和释放内存,但是变量的生命周期是写出高效程序所必须清楚的。

多重赋值:a[i],a[j] = a[j],a[i]

类型声名(重定义):type name underlying-type 如:type Celsius float64

包的作用和其他语言中的库或者模块作用类似,用于支持模块化、封装、编译隔离和重用。
每一个包给他的声明提供独立的命名空间。
包可以让我们通过控制变量在包外面的可见性或导出的情况来隐藏信息。在Go里,通过一条简单的规则来管理标识符是否对外可见:导出的标识符以大写字母开头。

包的初始化:
变量按照声明顺序初始化,在依赖已解析的情况下,根据依赖进行初始化。

var a = b+c //最后把a初始化为3
var b = f() //通过调用f接着把b初始化为2
var c = 1  //首先初始化为1
func f() int { return c + 1}

对于包级别的每一个变量,生命周期从其值被初始化开始,但是对于其他一些变量,init函数的机制会比较简单。任何文件可以包含任意数量的声明如下的函数:

func init(){/* ... */}

这个init函数不能被调用和被引用,他也是普通的函数。在每一个文件里,当程序启动的时候,init函数按照他们声明的顺序自动执行。
包的初始化按照在程序中导入的顺序来执行,依赖顺序优先,每次初始化一个包。因此,如果包p导入了包q,可以确保q在p之前已经完全初始化。初始化过程是自下向上的,main包最后初始化。
在这种方式下,在程序的main函数开始执行前,所有的包已经初始化完毕。

 

程序的启动顺序


总结: 在一个go文件中, 初始化顺序规则: (1)引入的包 (2) 当前包中的变量常量 (3) 当前包的init (4)main函数

 

可参考博文:https://blog.csdn.net/htyu_0203_39/article/details/50948193

作用域:
在包级别(就是在让你和函数外)的声明,可以被同一个包里的任何文件引用。导入的包是文件级别的,所以他们可以在同一个文件内引用,但是不能在没有另一个import语句的前提下被同一个包中其他文件中的东西引用。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Rage_/article/details/88538777
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 19:39:45
  • 阅读 ( 1152 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢