import导包路径问题与init方法调用流程

522 阅读2分钟

import导包路径问题

因为我import导包路径上面出了点问题,还没有得到解决,明日再寻找方法解决。

image.png

实在是给我整不会了,明天再更新import部分

——————————————————分割线———————————————————

已经找到了解决方法

image.png

这是我的代码结构,lib1和lib2包下的两个文件内,分别有两个方法,我需要在main.go文件中,调用lib1.go和lib2.go的方法。那么我就要先导入lib1包和lib2包,如下

package main

import (
   "Go_Workspace/5-init/lib1"
   "Go_Workspace/5-init/lib2"
)

func main() {
   lib1.Lib1Test()
   lib2.Lib2Test()
}

lib1.go文件如下

package lib1

import "fmt"

// 当前lib1包提供的api
//方法首字母大写代表此方法是一个对外开放的接口
//小写则代表此方法只能在本包内调用
func Lib1Test() {
   fmt.Println("lib1Test()......")
}

func init() {
   fmt.Println("lib1.5-init()......")
}

lib2.go文件如下

package lib2

import "fmt"

// 当前lib2包提供的api
func Lib2Test() {
   fmt.Println("lib2Test()......")
}

func init() {
   fmt.Println("lib2.5-init()......")
}

我昨天的问题就出在了lib1.go与lib2.go内部的导包错误,我应该写package lib1(lib2),而不是package main。 image.png

因为我这两个文件里面根本就没有用到main方法,而且如果不package lib1(lib2)的话,就代表,在lib1与lib2包内,并没有lib1.go与lib2.go,这是最关键的,这也就是为什么我

import (
   "Go_Workspace/5-init/lib1"
   "Go_Workspace/5-init/lib2"
)

会报错了。 image.png

init方法的调用流程

image.png 我们在写程序的的时候呢,不仅是main有出入口,实际上每个包都会有一个main函数来作为当前包的一个入口。

有关main函数和init一个调用的基本过程,我们一般进程入口呢是main来作为咱们程序主入口,然后呢实际上再往下走的时候呢,我会导入很多包,比如说import fmt等等吧。甚至是我们制定的自己的包。

当我们准备导包的时候呢,实际上这个程序在它的流程里并不会往下执行,而是先去这个包里解析有没有第二个包,然后继续往下递进的。直到它里边儿没有找到任何包为止。

然后它会分析里边儿的一些的有关全局常量,局部变量,最终才会去执行这个包里的init函数;

如果当前的包他没有定义init函数,这函数就不再执行了;

如果定义了的话,你重写的一个自定义的一个函数,它会执行,然后呢,出来反回去,继续分析以此类推。

最后执行main包里的全局变量、常量和init函数和main。

综上所述,init函数的优先级是要高于main函数的。