golang入门-- import包与包内init方法的执行时机

最近在学习revel(golang web开发框架) ,了解到revel管理和加载所有controller的方式。其中涉及的golang基础知识是import包。下面我们先来看看golang  imort包的几种方法和特征:

第一种方式相对路径

import   "./module"   //当前文件同一目录的module目录, 此方式没什么用容易出错

第二种方式绝对路径

import “LearnGo/init”     //加载gopath/src/LearnGo/init模块

下面展示一些特殊的import方式

1.点操作

我们有时候会看到如下的方式导入包

import( . “fmt” )  

这个点操作的含义就是这个包导入之后在你调用这个包的函数时,你可以省略前缀的包名,也就是前面你调用的fmt.Println("hello world")可以省略的写成Println("hello world")

2.别名操作

别名操作顾名思义我们可以把包命名成另一个我们用起来容易记忆的名字,revel框架的app/controllers/tmp/main.go(框架的启动入口)里可以看到此方式的应用。

import(
    f "fmt"
)

别名操作的话调用包函数时前缀变成了我们的前缀,即f.Println("hello world")。


import (//revel框架的代码片段
	"flag"
	"reflect"
	"github.com/revel/revel"
	controllers0 "github.com/revel/modules/static/app/controllers"
	_ "github.com/revel/modules/testrunner/app"
	controllers1 "github.com/revel/modules/testrunner/app/controllers"
	_ "guild_website/app"
	controllers "guild_website/app/controllers"
	tests "guild_website/tests"
	"github.com/revel/revel/testing"
)

3._操作

这个操作经常是让很多人费解的一个操作符,请看下面这个import

import (//revel框架的代码片段
	_ "github.com/revel/modules/testrunner/app"
	_ "guild_website/app"
)

_操作其实是引入该包,而不直接使用包里面的函数,而是调用了该包里面的init函数,要理解这个问题,需要看下面这个图,理解包是怎么按照顺序加载的:

程序的初始化和执行都起始于main包。如果main包还导入了其它的包,那么就会在编译时将它们依次导入。有时一个包会被多个包同时导入,那么它 只会被导入一次(例如很多包可能都会用到fmt包,但它只会被导入一次,因为没有必要导入多次)。当一个包被导入时,如果该包还导入了其它的包,那么会先 将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依次类推。等所有被导入的包都加载完毕了,就会开 始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执行main函数。此外需了解别名操作方式导入包也会执行init函数









你可能感兴趣的:(go)