Go语言初始化

幸运草
幸运草
幸运草
976
文章
3
评论
2020年4月20日21:26:28 评论 142

一、main函数和init函数

Go语言中有两个保留函数:init函数(能够应用于所有的package)和main函数(只能应用于package main)。这两个函数主要有一下特点:

  • 这两个函数在定义时不能有任何的参数和返回值。虽然一个package里面可以写任意多个init函数,但这无论是对于可读性还是以后的可维护性来说都不合适,强烈建议开发者在一个package中每个文件只写一个init函数。
  • Go 程序会自动调用init()和main(),所以你不需要在任何地方调用这两个函数。每个package中的init函数都是可选的,但package main就必须包含一个main函数。
  • 程序的初始化和执行都起始于main包。如果main包还导入了其它的包,那么就会在编译时将它们依次导入。有时一个包会被多个包同时导入,那么它只会被导入一次(例如很多包可能都会用到fmt包,但它只会被导入一次,因为没有必要导入多次)。当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依次类推。等所有被导入的包都加载完毕了,就会开始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执行main函数。下图详细地解释了整个执行过程:

Go语言初始化

main函数引入包初始化流程图

二、import

我们在写 Go 代码的时候经常用到 import 这个命令用来导入包文件,而我们经常看到的方式参考如下:

import{  "fmt"}

然后我们代码里面可以通过如下的方式调用:

fmt.Println("hello world")

上面这个 fmt 是 Go 语言的标准库,其实是去 goroot 下去加载该模块,当然 Go 的 import 还支持如下两种方式来加载自己写的模块:

1.  相对路径

// 当前文件同一目录的 model 目录,但是不建议这种方式来 importimport “./model”

2.  绝对路径

// 加载 gopath/src/shorturl/model 模块import “shorturl/model”

上面展示了一些 import 常用的几种方式,但是还有一些特殊的 import ,让很多新手很费解,下面我们来讲解一下到底是怎么一回事:

1.  点操作

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

import(  . "fmt")

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

2.  别名操作

别名操作顾名思义我们可以把包命名成另一个我们用起来容易记忆的名字

import(  f "fmt")

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

3. _ 操作

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

import ("database/sql"_ "github.com/ziutek/mymysql/godrv")

_ 操作其实是引入该包,而不直接使用包里面的函数,而是调用了该包里面的 init 函数。

特别声明:以上文章内容仅代表作者本人观点,不代表变化吧观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与变化吧联系。

转载请注明:{{title}}-变化吧
  • 赞助本站
  • 微信扫一扫
  • weinxin
  • 赞助本站
  • 支付宝扫一扫
  • weinxin
幸运草
Go语言中的常量 函数代码

Go语言中的常量

1 概述 常量,一经定义不可更改的量。功能角度看,当出现不需要被更改的数据时,应该使用常量进行存储,例如圆周率。从语法的角度看,使用常量可以保证数据,在整个运行期间内,不会被更改。例如当前处理器的架构...
Go语言的接口 函数代码

Go语言的接口

Go语言-接口 在Go语言中,一个接口类型总是代表着某一种类型(即所有实现它的类型)的行为。一个接口类型的声明通常会包含关键字type、类型名称、关键字interface以及由花括号包裹的若干方法声明...
Go语言支持的正则语法 函数代码

Go语言支持的正则语法

1 字符 语法 说明 . 任意字符,在单行模式(s标志)下,也可以匹配换行 字符类 否定字符类 d Perl 字符类 D 否定 Perl 字符类 ASCII 字符类 否定 ASCII 字符类 pN U...
Go语言的包管理 函数代码

Go语言的包管理

1 概述 Go 语言的源码复用建立在包(package)基础之上。包通过 package, import, GOPATH 操作完成。 2 main包 Go 语言的入口 main() 函数所在的包(pa...