📌Golang📌基础📌C-包和初始函数.txt
所有的go源码都是以".go"结尾。
编码: 源码文件必须是UTF-8格式,否则会导致编译器出错。
结束: 语句以 ";" 结束,多数时候可以省略。
注释: 持 "//"、"/**/" 两种注释方式,不能嵌套。
命名: 采用camelCasing风格(驼峰命名法),不建议使用下划线。

所有代码都必须组织在package中。
	源文件头部以 "package <name>" 声明包名称。
	包由同一目录下的多个源码文件组成。
	包名类似 namespace,与包所在目录名、编译文件名无关。 
	目录名最好不用main、all、std这三个保留名称。
	可执行文件必须包含package main,入口函数main。
 
同一个package下面,可以有非常多的不同文件,只要每个文件的头部都有如"package xxx"的相同name,就可以在主方法中使用xxx.Method()调用不同文件中的方法了。

在Go中,包中成员以名称首字母大小写决定访问权限。首字母大写的名称是被导出的。
在导入包之后,只能访问包所导出的名字,任何未导出的名字是不能被包外的代码访问的。
Foo和FOO都是被导出的名称。名称foo是不会被导出的。
该规则适用于全局变量、全局常量、类型、结构字段、函数、方法等。

使用包成员前,必须先用import关键字导入,但不能形成导入循环。
import "相对目录/包主文件名"
在导入时,可指定包成员访问方式。比如对包重命名,以避免同名冲突。
import "fmt" // 最常用的一种形式(系统包)
import "./test"	// 导入同一目录下test包中的内容(相对路径)
import "shorturl/model" // 加载gopath/src/shorturl/model模块(绝对路径)
import f "fmt" // 导入fmt,并给他启别名
import . "fmt" // 将fmt启用别名".",这样就可以直接使用其内容,而不用再添加fmt。如fmt.Println可以直接写成Println
import  _ "fmt" // 表示不使用该包,而是只是使用该包的init函数,并不显示的使用该包的其他内容。这种形式的import,当import时就执行了fmt包中的init函数,而不能够使用该包的其他函数。
未使用的导入包,会被编译器视为错误 (不包括"import _")。

“_”是特殊标识符,用来忽略结果。
使用【import _ 包路径】只是引用该包,仅仅是为了调用init()函数,无法通过包名来调用包中的其他函数。
下划线也作占位符,意思是那个位置本应赋给某个值,但是不需要这个值,就把该值赋给下划线,意思是丢掉不要。
这样编译器可以更好的优化,任何类型的单个值都可以丢给下划线。
如果用变量的接收返回值而不使用,编译器是会报错的,这时应将返回值赋给下划线。

导入路径包含internal关键字的包,只允许internal的父级目录及父级目录的子包导入,其它包无法导入。

go语言中init函数用于包(package)的初始化,该函数是go语言的一个重要特性。有下面的特征:
	init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等
	每个包可以拥有多个init函数,包的每个源文件也可以拥有多个init函数
	同一个包中多个init函数的执行顺序go语言没有明确的定义
	不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序
	init函数不能被其他函数调用,而是在main函数执行之前,自动被调用
	init函数在包所有全局变量初始化后执行,在单一线程被调,仅执行一次

mian函数是Go语言程序的默认入口函数(主函数)

init函数和main函数的异同:
相同点:
	两个函数在定义时不能有任何的参数和返回值,且Go程序自动调用。
不同点:
	init可以应用于任意包中,且可以重复定义多个。
	main函数只能用于main包中,且只能定义一个。

两个函数的执行顺序:
对同一个go文件的init()调用顺序是从上到下的。
对同一个package中不同文件是按文件名字符串比较“从小到大”顺序调用各文件中的init()函数。
对于不同的package,如果不相互依赖的话,按照main包中“先import的后调用”的顺序调用其包中的init(),
如果package存在依赖,则先调用最早被依赖的package中的init(),最后调用main函数。