1、包声明:文件所在目录,有利于源码整体迁移。

2、包导入:4种方式。

----------------------------------------------------------------------------------------------------------------------------------

1、同一文件夹下面的所有源文件的所属包只能是同一个包名字,且最好是该目录名称。举例说明如下:

imooc文件夹下有go源文件a.go,b.go,c.go,d.go,...等,那么所有这些go源文件中的第一行(非注释行)都是package  XXX,而且最好就是:package imooc

xiaomi文件夹下有go源文件x.go,y.go,z.go,w.go,...等,那么所有这些go源文件中的第一行(非注释行)都是package  YYY,而且最好就是:package xiaomi

当然,将上面的package  imooc与package xiaomi互换,即imooc文件夹下面的所有go源文件所属包为xiaomi,而xiaomi文件夹下面的所有go源文件所属包为imooc,也可以,但是这样的做法是一种智障,愚蠢,反人类的。

golang中的包如同其它一些编程语言中的类库或命名空间的概念。包是go的编译和安装的基本单元。每个go源文件必须首先声明自己属于哪个包,表明归属立场。

1、一个包下面的所有go源码文件的所属包最好都是该包名,而一个包下面的go源文件的文件名可以和包名相同,可以不同,即文件名没有约束。

 2、go源文件:必须在go源文件中非注释的第一行指明该源文件属于哪个包,如:package mainpackage main 表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。(go源文件所属包最好就是该文件所在的文件夹名称,最好一致,防止混乱

(1)go源码文件分为三类:命令源码文件、库源码文件和测试源码文件。测试源码文件是来测试前两者的。如果一个go源码文件是声明自己属于main包,且该文件中有一个无参数无返回值的函数名称为imain的函数,则该文件叫做命令源码文件,是程序的入口,会生成可执行文件,会被安装到GOBIN指定的目录中。测试源码文件以“_test.go”命名,每个测试源码文件中至少有一个函数的名称是以“Test”或“Benchmark”为前缀的。其余的文件则是库源码文件。

(2)同一个main包中可以有多个命令源码文件,可通过go run来分别运行。但是此时无法通过go build编译该包,且也无法通过go install安装该包。因此拒绝同一个main包中有多个命令源码文件。命令源码文件可以在存放在其他包中,但是声明还是属于main包,但是尽量避免。

(3)同一个mian包中可以同时有命令源码文件和库源码文件,但是此时无法正常通过go build编译该包,且也无法正常通过go install安装该包,因为一个软件或程序模块的启动入口只有一个。因此拒绝同一个main包中混合着库源码文件。

(4)

(5)根据上述可知,推荐:项目只有一个main包,且该包下面只有一个命令源码文件,最好命令源码文件的文件名就是mian。main包,main文件名,main函数,一条线。

3、所有的包名都应该使用小写字母。属于同一个包的源文件必须全部被一起编译,一个包即是编译时的一个单元,因此根据惯例,每个目录都只包含一个包

4、包的导入的写法。导入的包必须要被使用,否则无法构建程序。源码包中的多个init函数执行顺序不确定,因此,尽量最多一个init函数。

5、可见性规则。包级别的名字,当标识符(常量(const)、变量(var)、类型(type)、函数(func)、结构体(struct)等等)以一个大写字母开头,如:Add,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为包可导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 private )。(大写字母可以使用任何 Unicode 编码的字符,比如希腊文,不仅仅是 ASCII 码中的大写字母)。因此,在导入一个外部包后,能够且只能够访问该包中可导出的对象。当然被导入包的存放位置必须是在环境变量GOPATH中定义的工作目录下面,否则无法找到

假设在包 pack1 中我们有一个变量或函数叫做 Thing(以 T 开头,所以它能够被导出),那么在当前包中导入 pack1 包后,Thing 就可以像面向对象语言那样使用点标记来调用:pack1.Thing(pack1 在这里是不可以省略的)。

因此包也可以作为命名空间使用,帮助避免命名冲突(名称冲突):两个包中的同名变量的区别在于他们的包名,例如 pack1.Thingpack2.Thing。当然,你可以通过使用包的别名来解决包名之间的名称冲突,或者说根据你的个人喜好对包名进行重新设置,如:import fm "fmt"

package main

import fm  "fmt" 

func main() {

fm.Println("hello, world")

}

6、一个程序必须有一个main包,main包中必须有一个源文件中含有一个main函数,且main函数既没有参数,也没有返回类型。

7、每个包都对应一个独立的名字空间。例如,在image包中的Decode函数和在unicode/utf16包中的 Decode函数是不同的。要在外部引用该函数,必须显式使用image.Decode或utf16.Decode形式访问。

8、包的初始化。以导入声明的顺序初始化,按照包依赖关系初始化,main包最后被初始化,且每个包只会被初始化一次。每个包的初始化是按照包中的init函数首先被初始化,然后按照先后顺序初始化包。

8、尽量在main包下面只写一个含有main函数的go源文件即可。

解决main包中源文件不能相互之间调用,如下main包中的main.go文件不能调用main包中的test.go文件,这是因为goland软件默认按照以文件为单位编译,因此也就默认编译了man函数所在的main.go文件,如下:

那么就需要修改goland软件的编译方式,有三种选择,分别是File,Package,Directory。那么选择为Package包方式编译,写好包路径即可,如下:view----Toolbar,然后找到edit configurations即可调节。

设置好后,不要用快捷键ctrl+shift+f10来启动程序,因为这个快捷键就是按照文件来的,而是用shift+f10,或者用最上面的按钮,按钮如下图:

那么如果在命令行上启动呢?效果如下:

#go run main.go,则不能正常编译,要用go run   *.go

因此,为了避免这样的麻烦,尽量在main包下面只写一个含有main函数的go源文件即可。

golang的包规则的更多相关文章

  1. Golang : pflag 包简介

    笔者在前文中介绍了 Golang 标准库中 flag 包的用法,事实上有一个第三方的命令行参数解析包 pflag 比 flag 包使用的更为广泛.pflag 包的设计目的就是替代标准库中的 flag ...

  2. 3.Golang的包导入

    1.golang的源码文件可以随意命名,但是属于同一个包的源文件必须声明 package base 2.golang的包引入规则 import ( "fmt" #系统包直接写名字 ...

  3. Wireshark抓包工具使用教程以及常用抓包规则

    转载:http://fangxin.blog.51cto.com/1125131/735178 Wireshark是一个非常好用的抓包工具,当我们遇到一些和网络相关的问题时,可以通过这个工具进行分析, ...

  4. Golang fmt包使用小技巧

    h1 { margin-top: 0.6cm; margin-bottom: 0.58cm; direction: ltr; color: #000000; line-height: 200%; te ...

  5. Golang Vendor 包机制 及 注意事项

    现在的 Go 版本是 1.8,早在 1.5 时期,就有了 Vendor 包机制,详情可查看博文:“理解 Go 1.5 vendor”. 遇到的问题 个人在使用 Glide 管理 Vendor 包时(附 ...

  6. Golang Vendor 包管理工具 glide 使用教程

    Glide 是 Golang 的 Vendor 包管理器,方便你管理 vendor 和 verdor 包.类似 Java 的 Maven,PHP 的 Composer. Github:https:// ...

  7. golang reflect包使用解析

    golang reflect包使用解析 参考 Go反射编码 2个重要的类型 Type Value 其中Type是interface类型,Value是struct类型,意识到这一点很重要 Type和Va ...

  8. Golang测试包

    Golang测试包 golang自带了测试包(testing),直接可以进行单元测试.性能分析.输出结果验证等.简单看着官方文档试了试,总结一下: 目录结构和命令 使用golang的测试包,需要遵循简 ...

  9. Golang : cobra 包解析

    笔者在<Golang : cobra 包简介>一文中简要的介绍了 cobra 包及其基本的用法,本文我们从代码的角度来了解下 cobra 的核心逻辑. Command 结构体 Comman ...

随机推荐

  1. OpenCV读取RTSP视频流

    用opencv的VideoCapture读取RTSP视频流,只有opencv3.1版本可以,之前的版本都无法读取视频流.可能的原因是云平台的RTSP视频流太差,经常错码.项目最后使用的是opencv2 ...

  2. 【Redis缓存机制】1.Redis介绍和使用场景

    (1)持久化数据库的缺点平常我们使用的关系型数据库有Mysql.Oracle以及SqlServer等,在开发的过程中,数据通常都是通过Web提供的数据库驱动来链接数据库进行增删改查. 那么,我们日常使 ...

  3. 掌握ES6/ES2015核心内容

    ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015. 也就是说,ES6就是ES2015. ...

  4. 【agc013d】AtCoder Grand Contest 013 D - Piling Up

    题意 盒子里有n块砖,每块的颜色可能为蓝色或红色. 执行m次三步操作: 1.从盒子里随便拿走一块砖 2.放入一块蓝砖和红砖到盒子里 3.从盒子里随便拿走一块砖 给定n,m 问拿出来的砖,可能有多少种不 ...

  5. 爬虫(四)Selenium + Headless Chrome爬取Bing图片搜索结果

    Bing图片搜索结果是动态加载的,如果我们直接用requests去访问页面爬取数据,那我们只能拿到很少的图片.所以我们使用Selenium + Headless Chrome来爬取搜索结果.在开始前, ...

  6. webServices学习三(概念详解)

    WebService通过HTTP协议完成远程调用: (深入分析) WebService只采用HTTP POST方式传输数据,不使用GET方式; -- 握手,WSDL-get, 普通http post的 ...

  7. stringstream的使用 UVA 10815

    水题题目描述就不写了 主要是发现stringstream真的是好用,可以把string绑定到stringstream中,然后就能以空格为分隔符分割出每个单词,听说每次重新创建stringstream开 ...

  8. (大概是最全的解决方法)使用bandicam录制视频导入pr后音画不同步问题

    遇到这个问题大部分都是使用了VBR来录制视频导致的, 搜集了各种能够找到的方法,并没有每个尝试过 一 Handbrake转码 Audio out of sync AFTER importing 解决方 ...

  9. 批量操作文本文件进行dos/unix格式转换

    批量将目录下所有文件进行 dos/unix 格式转换 使用 sed + grep #sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录` eg:  ...

  10. 直接在安装了redis的Linux机器上操作redis数据存储类型--String类型

    一.概述: 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等.在Redis中字符串类型 ...