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. (转载)JavaScript世界万物诞生记

    一. 无中生有 起初,什么都没有.造物主说:没有东西本身也是一种东西啊,于是就有了null: 现在我们要造点儿东西出来.但是没有原料怎么办?有一个声音说:不是有null嘛?另一个声音说:可是null代 ...

  2. redis教程(三)-----redis缓存雪崩、缓存穿透、缓存预热

    缓存雪崩 概念 缓存雪崩是由于原有缓存失效(过期),新缓存未到期间.所有请求都去查询数据库,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机.从而形成一系列连锁反应,造成整个系统崩溃. 解决 ...

  3. mybatis学习:mybatis注解开发一对多

    实体类User: public class User implements Serializable { private Integer id; private String username; pr ...

  4. pytorch 多GPU训练过程中出现ap=0情况

    原因可能是pytorch 自带的BN bug:安装nvidia apex 可以解决: $ git clone https://github.com/NVIDIA/apex $ cd apex $ pi ...

  5. 前端插件--swiper.js

    使用swiper.js还要注意引入它的同时也要引入swiper.css样式文件: swiper官方文档:http://www.swiper.com.cn/api/effects/193.html 实例 ...

  6. JavaScript创建对象的几种方式总结

    ECMA把对象定义为:无序属性的集合,其属性可以包含基本值.对象或者函数. 1. 使用Object构造函数创建对象 创建自定义对象的最简单的方式就是创建一个Object的实例,然后再为它添加属性和方法 ...

  7. DLX

    #include <iostream> #include <cstdlib> #include <cstring> #include <queue> # ...

  8. poj 3304 Segments(计算直线与线段之间的关系)

    Segments Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10921   Accepted: 3422 Descrip ...

  9. 10分钟完成 mongodb replSet 部署

    开始: ------------------------------------------------------------------------------------------------ ...

  10. CSS:你真的懂margin吗?

    你真的了解margin吗?你知道margin有什么特性吗?你知道什么是垂直外边距合并? margin在块元素.内联元素中的区别?什么时候该用padding而不是margin?你知道负margin吗?你 ...