初识Go(5)
main函数和init函数
虽然一个 package里面可以写任意多个 init 函数,
但这无论是对于可读性还是以后的可维护性来说,我们都
强烈建议用户在一个 package 中每个文件只写一个 init
函数。Go 程序会自动调用 init()和 main(),所以你不需
要在任何地方调用这两个函数。每个package 中的 init 函
数都是可选的,但 package main 就必须包含一个 main 函数。
main 函数引入包初始化流程图
import操作
1. 点操作
我们有时候会看到如下的方式导入包
import(
. "fmt"
)
这个点操作的含义就是这个包导入之后在你调用这个包的函数时,你可以省略前缀的包名,
也就是前面你调用的 fmt.Println("hello world")可以省略的写成 Println("hello world")
2. 别名操作
别名操作顾名思义我们可以把包命名成另一个我们用起来容易记忆的名字
import(
f "fmt"
)
3. _操作
这个操作经常是让很多人费解的一个操作符,请看下面这个 import
import (
"database/sql"
_ "github.com/ziutek/mymysql/godrv"
)
_操作其实是引入该包,而不直接使用包里面的函数,而是调用了该包里面的 init 函数
struct
Go 语言中也和C或者其他语言一样,我们可以声明新的类型,
作为其它类型的属性或字段的容器.
type person struct { name string age int } var P person // P 现在就是 person 类型的变量了 P.name = "Astaxie" // 赋值"Astaxie"给 P 的 name 属性. P.age = 25 // 赋值"25"给变量 P 的 age 属性
另外两种声明方式:
1.按照顺序提供初始化值
P := person{"Tom", 25}
2.通过 field:value 的方式初始化,这样可以任意顺序
P := person{age:24, name:"Tom"}
Go支持只提供类型,而不写字段名的方式,也就是匿名字段,也称为嵌入字段。
type Human struct { name string age int weight int } type Student struct { Human // 匿名字段,那么默认 Student 就包含了 Human 的所有字段 speciality string }
这里有一个问题:如果 human 里面有一个字段叫做 phone,而 student 也有一个字段叫做
phone,那么该怎么办呢?
Go 里面很简单的解决了这个问题,最外层的优先访问,也就是当你通过 student.phone 访
问的时候,是访问 student 里面的字段,而不是 human 里面的字段。