2019独角兽企业重金招聘Python工程师标准>>>

Golang GOPATH & 包的定义 & 包的导入

GOPATH 设置

go 命令依赖一个重要的环境变量:$GOPATH

可以在 .zshrc 配置文件中加上一行这样的配置,

export GOPATH=/Users/flyme/mygo

Go从1.1版本到1.7必须设置这个变量,而且不能和Go的安装目录一样,这个目录用来存放Go源码,Go的可运行文件,以及相应的编译之后的包文件。所以这个目录下面有三个子目录:src、bin、pkg

从go 1.8开始,GOPATH环境变量现在有一个默认值,如果它没有被设置。 它在Unix上默认为$HOME/go。

GOPATH允许多个目录,当有多个目录时,请注意分隔符,多个目录的时候Windows是分号,Linux系统是冒号,当有多个GOPATH时,默认会将go get的内容放在第一个目录下。

以上 $GOPATH 目录约定有三个子目录:

  • src 存放源代码(比如:.go .c .h .s等)
  • pkg 编译后生成的文件(比如:.a)
  • bin 编译后生成的可执行文件(为了方便,可以把此目录加入到 $PATH 变量中,如果有多个gopath,那么使用${GOPATH//://bin:}/bin添加所有的bin目录)

.zshrc PATH 和 GOPATH 环境变量的配置

export GOPATH=/Users/flyme/mygo
export PATH=$MAVEN_HOME/bin:${GOPATH//://bin:}/bin:$PATH

检查是否配置成功,

➜  ~ echo $GOPATH
/Users/flyme/mygo:/Users/flyme/workspace-go
➜  ~ echo $PATH
/Users/flyme/IDE/apache-maven-3.3.9/bin:/Users/flyme/mygo/bin:/Users/flyme/workspace-go/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/usr/local/mysql/bin
➜  ~

包的定义

GOPATH下的src目录就是接下来开发程序的主要目录,所有的源码都是放在这个目录下面,那么一般我们的做法就是一个目录一个项目,例如: $GOPATH/src/mymath 表示mymath这个应用包或者可执行应用,这个根据package是main还是其他来决定,main的话就是可执行应用,其他的话就是应用包。

main package不同于其它library package,它定义了一个可执行程序。其中的main函数即是可执行文件的入口函数。

所以当新建应用或者一个代码包时都是在src目录下新建一个文件夹,文件夹名称一般是代码包名称,当然也允许多级目录,例如在src下面新建了目录$GOPATH/src/github.com/astaxie/beedb 那么这个包路径就是"github.com/astaxie/beedb",包名称是最后一个目录beedb。

在每个Go源文件的开头都必须有包声明语句。包声明语句的主要目的是确定当前包被其它包导入时默认的标识符(也称为包名)。

例如,math/rand包的每个源文件的开头都包含package rand包声明语句,所以当你导入这个包,你就可以用rand.Int、rand.Float64类似的方式访问包的成员。

关于默认包名一般采用导入路径名的最后一段的约定也有三种例外情况。

第一个例外,包对应一个可执行程序,也就是main包,这时候main包本身的导入路径是无关紧要的。名字为main的包是给go build构建命令一个信息,这个包编译完之后必须调用连接器生成一个可执行程序。

第二个例外,包所在的目录中可能有一些文件名是以test.go为后缀的Go源文件,并且这些源文件声明的包名也是以test为后缀名的。这种目录可以包含两种包:一种普通包,加一种则是测试的外部扩展包。所有以test为后缀包名的测试外部扩展包都由go test命令独立编译,普通包和测试的外部扩展包是相互独立的。

第三个例外,一些依赖版本号的管理工具会在导入路径后追加版本号信息,例如"gopkg.in/yaml.v2"。这种情况下包的名字并不包含版本号后缀,而是yaml。

包的导入声明

如果我们想同时导入两个有着名字相同的包,例如math/rand包和crypto/rand包,那么导入声明必须至少为一个同名包指定一个新的包名以避免冲突。这叫做导入包的重命名。

import ("crypto/rand"mrand "math/rand" // alternative name mrand avoids conflict
)

包的匿名导入

如果只是导入一个包而并不使用导入的包将会导致一个编译错误。但是有时候我们只是想利用导入包而产生的副作用:它会计算包级变量的初始化表达式和执行导入包的init初始化函数。这时候我们需要抑制“unused import”编译错误,我们可以用下划线来重命名导入的包。像往常一样,下划线为空白标识符,并不能被访问。

import _ "image/png" // register PNG decoder

============END============

转载于:https://my.oschina.net/xinxingegeya/blog/718305

Golang GOPATH 包相关推荐

  1. 【golang程序包推荐分享】go-ini、viper、godoc

    [golang程序包推荐&分享]go-ini.viper.godoc 一.go-ini 1.程序包简介 2.下载安装 3.简单使用[截取自官网] 二.viper 1.程序包简介 2.下载安装 ...

  2. golang 理解包导入

    Golang使用包(package)这种语法元素来组织源码,所有语法可见性均定义在package这个级别,与Java .python等语言相比,这算不上什么创新,但与C传统的include相比,则是显 ...

  3. golang 第三方包的使用总结

    golang 第三方包的安装的方法 1. go get 安装 # 比如要安装 "github.com/gin-gonic/gin" $ go get github.com/gin- ...

  4. Golang安装及golang.org包的安装

    Golang安装 Golang官网提供了各平台的二进制包,可直接下载并安装.由于某种不可抗力,golang.org被屏蔽无法直接访问,但可以通过官方提供的国内版官网golang.google.cn进行 ...

  5. glide 下载golang.org包问题

    2019独角兽企业重金招聘Python工程师标准>>> 今天编译Uber的Aresgo.依赖管理用 glide,下载golang.org 包的时候遇到问题. 方法一: 设置 glid ...

  6. golang导入包的理解

     golang导入包的理解 1.首先是包的引入原理 程序的初始化和执行都起始于main包.如果main包还导入了其它的包,那么就会在编译时将它们依次导入.有时一个包会被多个包同时导入,那么它只会被 ...

  7. golang中包互相引用的解决方法

    golang中包互相引用的解决方法 参考文章: (1)golang中包互相引用的解决方法 (2)https://www.cnblogs.com/chukuang2004/p/6930898.html ...

  8. golang官方包下载地址

    https://github.com/golang 官方包github下载地址

  9. golang的包管理系统比较

    下面是测试结果 - 自带的vendor- 项目创建vendor子目录,然后github的地址放进去就ok了- govendor- 安装:go get -u github.com/kardianos/g ...

最新文章

  1. Python读取.set文件和.locs文件
  2. mysql插入数据die_吴裕雄 10-MySQL插入数据
  3. JavaScript实现希尔密码 算法(附完 整源码)
  4. 我的Go+语言初体验——【一、go+环境WIN10_100%成功安装(附-视频)】
  5. 微信公众号怎么快速导出一个月的文章数据
  6. PHP开发套件采用wamp时配置PHPStorm
  7. powershell提取html字段,使用PowerShell或VBS从HTML文件中提取表
  8. 三种Fibonacci数列第n项计算方法及其优劣分析
  9. 「leetcode」1. 两数之和:map等候多时了
  10. Excel 的进阶学习
  11. openrefine的 General Refine Expression Language(GREL)
  12. opencv安装与配置vs2019
  13. 3t studio 导出数据_Studio 3t for MongoDB 最好的MongoDB工具
  14. Capture CIS配置Mysql数据库连接
  15. (附源码)app学科竞赛活动报名系统 毕业设计 012239
  16. PLC滤波算法之卡尔曼滤波(kalman Filter)代码+测试
  17. igraph java_igraph从邻接列表生成邻接矩阵
  18. 使用nodejs机器学习进行app流量判别
  19. HCS12X微控制器的外部总线接口介绍
  20. 二叉树遍历之前序遍历,中序遍历,后序遍历

热门文章

  1. Heap 3214 LIS题解
  2. verilog HDL 编码风格
  3. 以嵌入式系统设计师考试成绩,开始嵌入式博客之旅
  4. 【短语学习】盈余量分析(earned value analysis)
  5. javascript 日期控件
  6. 在linux系统中查看组管理信息命令,Linux用户和组管理常用命令
  7. linux嵌入式贪吃蛇
  8. linux进程互斥要点,linux进程之间互斥
  9. spring事务三大接口
  10. java for循环 嵌套for循环-标签使用