1.1 golang中的init函数和main函数
1、init函数和main函数
1. golang里面有两个保留的函数:init函数(用于所有package)和main函数(只能用于package main)。(这两个函数在定义时不能有任何的参数和返回值)
2. 每个package中的init函数都是可选的,但package main就必须包含一个main函数。
3. go程序会自动调用init()和main(),所以你不需要在任何地方调用这两个函数。
4. 程序的初始化和执行都起始于main包。如果main包还导入了其它的包,那么就会在编译时将它们依次导入。
5. 等所有被导入的包都加载完毕了,就会开始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执行main函数。
2、调用过程
3、在main package中调用add package中变量和方法
1. 直接使用默认包名调用add中方法
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package main import ( "LearGoProject/day1/example3/add" // 下面可以直接使用package名字 add 调用变量和方法 "fmt" ) func main() { add.Test() // 调用add.go中的Test()方法就会修改Name、和Age的值 fmt.Println(add.Name) // 打印add中的变量Name :hello go fmt.Println(add.Age) // 打印add中的变量Age :100 }
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package add var Name string = "hello world" // 变量名为大写才不是私有的,可以在main.go中访问 var Age int = 10 func Test() { Name = "hello go" Age = 100 }
2. 通过包别名调用 addd package中变量和方法
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package main
import (
aa "LearGoProject/day1/example3/add" // 将add这个文件取一个别名 aa 下面调用add.go中方法就是用aa
"fmt"
)
func main() {
aa.Test() // 通过package别名aa来调用add package中方法
fmt.Println(aa.Name) // 打印add中的变量Name :hello go
fmt.Println(aa.Age) // 打印add中的变量Age :100
}
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package add var Name string = "hello world" // 变量名为大写才不是私有的,可以在main.go中访问 var Age int = 10 func Test() { Name = "hello go" Age = 100 }
3. 通过init方法自动调用
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package main import ( aa "LearGoProject/day1/example3/add" // 将add这个文件取一个别名 aa 下面调用add.go中方法就是用aa "fmt" ) func main() { //aa.Test() // 这里add中修改变量的方法写在init中所以会自动调用 fmt.Println(aa.Name) // 打印add中的变量Name :hello go fmt.Println(aa.Age) // 打印add中的变量Age :100 }
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package add var Name string = "hello world" // 变量名为大写才不是私有的,可以在main.go中访问 var Age int = 10 // 每个源文件可以包含一个init函数,这个init函数自动被go运行的框架调用 func init() { Name = "hello go" Age = 100 }
1.2 程序结构
1、声明
1. Go语言主要有四种类型的声明:var(变量)、const(常量)、type(类型)和func(函数)。
2. 在包一级声明语句声明的名字可在整个包对应的每个源文件中访问,而不是仅仅在其声明语句所在的源文件中访问
3. 在函数内的声明只能在函数内访问。
2、变量
1)var 变量名字 类型 = 表达式
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package main import "fmt" var a int = 9 var str string ="I Am String" func main() { fmt.Println(a) fmt.Println(str) }
2)简短变量声明
1. 请记住“:=”是一个变量声明语句,而“=‘是一个变量赋值操作。
2. := 是声明并赋值,并且系统自动推断类型,不需要var关键字
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package main import "fmt" func main() { i := 100 // an int fmt.Println(i) }
3、指针
1)指针介绍
1. 一个变量对应一个保存了变量对应类型值的内存空间,普通变量在声明语句创建时被绑定到一个变量名,比如叫x的变量
2. 但是还有很多变量始终以表达式方式引入,例如x[i]或x.f变量。
3. 一个指针的值是另一个变量的地址,一个指针对应变量在内存中的存储位置
4. 并不是每一个值都会有一个内存地址,但是对于每一个变量必然有对应的内存地址。
5. 通过指针,我们可以直接读或更新对应变量的值,而不需要知道该变量的名字(如果变量有名字的话)。
2)指针举例
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package main import "fmt" func main() { x := 1 // 什么一个x变量 p := &x // &x表达式(取x变量的内存地址)将产生一个指向该整数变量的指针p fmt.Println(*p) // "1" *p 表达式对应p指针指向的变量的值 *p = 2 // *p = 2 等价于 x = 2 表示更新指针所指向的变量的值。 fmt.Println(x) // "2" 此时再打印x已经是*p更新过的结果2 } /* 如果用“var x int”声明语句声明一个x变量, 那么&x表达式(取x变量的内存地址)将产生一个指向该整数变量的指针 指针对应的数据类型是 *int ,指针被称之为“指向int类型的指针” 如果指针名字为p,那么可以说“p指针指向变量x”,或者说“p指针保存了x变量的内存地址”。 同时 *p 表达式对应p指针指向的变量的值。 一般 *p 表达式读取指针指向的变量的值,这里为int类型的值,同时因为 *p 对应一个变量 所以该表达式也可以出现在赋值语句的左边,表示更新指针所指向的变量的值。 */
4、new函数
1. 表达式new(T)将创建一个T类型的匿名变量,初始化为T类型的零值,然后返回变量地址,返回的指针类型为 *T
2. 用new创建变量和普通变量声明语句方式创建变量没有什么区别,除了不需要声明一个临时变量的名字外,我们还可以在表达式中使用new(T)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
func newInt() *int { return new(int) } func newInt() *int { var dummy int return &dummy }
11111111111111111