• 技术文章 >后端开发 >Golang

    go语言必须有一个什么包

    青灯夜游青灯夜游2023-01-04 20:30:17原创224

    go语言必须有一个main包。Go语言是编译型的静态语言,所以在运行Go语言程序之前,需要先将其编译成二进制的可执行文件;而要生成Go语言可执行程序,必须要有名为main的包,且在该包下必须有且只有一个main函数。

    本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。

    1. 包的概念和源文件

    Go程序是通过把包链接到一起构成的。包是由一个个一起定义了属于该包的常量、类型、变量、函数(它们可以被同一个包内的所有文件访问,也可以通过导出而被其他的包使用)的源文件构成的。每个包的代码都可以作为很小的复用单元,被其他项目所引用。

    每个源文件都有一个package语句定义了它属于哪 个包,后面跟着可能为空的import集合声明了需要使用哪些包,再往后跟着可能为空的函数、类型、变量、常量的集合。

    我们可以看到名为code和errno的文件的归属包,都为errno,这就表明,在Go中并不像Java那样以一个类作为复用单元,而是以包作为一个很小的复用单元。

    总结:在Go中最小的单元是包,而包下的可以有多个源文件,源文件就相当于class类,每个源文件通过package语句声明了该文件属于哪个包。

    2. main包

    在Go语言里,命名为main的包具有特殊的含义。Go语言的编译程序会试图把这种名字的包编译为二进制的可执行文件。所有用Go语言编译的可执行程序都必须有一个名为main的包。

    简单来说:要生成Go语言可执行程序,必须要有名为main的package包,且在该包下必须有且只有一个main函数

    当编译器发现这个某个包的名字为main是,它一定也会发现名为main()是函数,否则不会创建可执行文件。main()函数是程序的入口,所以,如果没有这个函数,程序就没有办法开始执行。程序编译时,会使用声明main包的代码所在的目录的目录名作为二进制可执行文件的文件名。

    3. 包目录的命名规范

    所谓无规矩不成方圆,在开发Go语言之前,我们一定要了解Go语言的一些特性和规范才能更好的开发出高质量,可通用的代码,不然开发出一个只有你能看明白的程序,那只能算是自娱自乐罢了。本节根据一些经典代码和公司开发习惯给出了一个命名规范示例,示例如下:

    下面根据这个示例图,讲解一下我理解的开发规范:

    4. 导入

    包的引入原理

    程序的初始化和执行都起始于main包。如果main包还导入了其它的包,那么就会在编译时将它们依次导入。一个被多个地方导入的包只会被导入一次。当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依次类推。等所有被导入的包都加载完毕了,就会开始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执行main函数。
    包在导入时,查找依赖时根据从高到低的优先级来划分,大概:

    包导入的语法

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

    import(
        "fmt"
    )

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

    fmt.Println("hello world")

    上面这个fmt是Go语言的标准库,他其实是去GOROOT下去加载该模块。

    import (
       . "fmt"
    )

    这个点操作的含义就是这个包导入之后在你调用这个包的函数时,你可以省略前缀的包名,也就是前面你调用的fmt.Println(“hello world”) 可以省略的写成Println(“hello world”)。注意:该包内的函数不能与其重名。

    import( f “fmt” )

    别名操作顾名思义可以把包命名成另一个用起来容易记忆的名字,别名操作调用包函数时前缀变成了重命名的前缀,即f.Println(“hello world”),通常为了解决导入多个重名包的问题。

    import (
        _ "github.com/go-sql-driver/mysql"
    )

    _操作其实只是引入该包但不使用,通常只为了执行该包中所有的init()函数,最常见的就是上面的mysql包。

    【相关推荐:Go视频教程编程教学

    以上就是go语言必须有一个什么包的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Golang go语言
    上一篇:go语言中的输出方法有哪些 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • go语言怎么将整型转为字符串• go语言的字面量是什么• go语言中线程和进程的区别是什么• go语言可以写物联网吗• go语言的复数用来做什么• go语言的形参占用内存吗
    1/1

    PHP中文网