测试下go多page包调用时是如何实现的,这里测试实战下。
为后面使用go get做准备

首先检查环境:

GOROOT 指向系统安装路径
GOPATH 指向工作路径

一、同一目录下多个文件共用一个包时

一个路径下只能存在一个package,一个package可以由多个源代码文件组成
api.go

package mainimport "fmt"func Api() {fmt.Println("api")
}

main.go

package mainimport ("fmt"
)func main() {fmt.Println("vim-go")//test apiApi()
}

如上,两个文件都属于同一个main包,直接编译即可。

二、同一目录多个包时

方式1:通过GOPATH管理多个package

先引入一个知识点。

Go compiler的package搜索顺序
  1. 首先,Go compiler会在GO安装目录(GOROOT,这里Linux安装目录/usr/local/go)下查找是否有src/pkg/hello相关包源码;如果没有则继续;
  2. 如果export GOPATH=PATH1:PAHT2,则Go compiler会依次查找是否存在PATH1/src/hello、PATH2/src/hello;配置在GOPATH中的PATH1和PATH2被称作workplace
  3. 如果在上述几个位置均无法找到hello这个package,则提示出错。
验证测试

这里自己的go版本比较高,所以直接关闭了go mod机制,同时设置GOPATH路径来测试:

➜  main export GOPATH=/data/home/cooperswang/code_study/
➜  main go env GOPATH
/data/home/cooperswang/code_study/
➜  main export GO111MODULE=off
➜  main go env GOPATH
/data/home/cooperswang/code_study/


代码结构如图:

这里重点main.go中调用其它packge的方式:

可以看到,这时采用相对路径的方式实现自定义包的查找,使用的查找顺序如上面的知识点,主要使用了GOPATH路径。

不过这里仍有点不明白,不清楚go查找包到底是怎么起作用的,先记录下吧

方式2:使用Go mod管理多个package

Golang在1.11版本中引入了go mod机制,在统一的位置对依赖进行管理。

go mod不同于以往基于GOPATH和Vendor的构建方式,其主要是通过GOPATH/pkg/mod下的缓存包来对工程进行构建。在Go 1.11中已经可以使用,同以往新添加的功能一样,go mod 可以通过GO111MODULE来控制是否启用,GO111MODULE有一下三种类型。

on 所有的构建,都使用Module机制
off 所有的构建,都不使用Module机制,而是使用GOPATH和Vendor
auto 在GOPATH下的工程,不使用Module机制,不在GOPATH下的工程使用

Go mod化处理步骤

  • 在项目的根目录下使用命令go mod init projectName
  • 在该目录下执行go build main.go

can-i-have-multiple-packages-inside-a-single-go-module-how
建立项目HelloWorld,在顶层目录使用go mod init生成go.mod文件。

此时go.mod文件:

module HelloWorldgo 1.13

此时hello包和main包内容:

➜  HelloWorld cat src/hello/hello.go
package helloimport "fmt"func Hello() {fmt.Println("hello wsq")
}➜  HelloWorld cat src/main/main.go
package mainimport "HelloWorld/src/hello"func main() {hello.Hello()
}

此时,在HelloWorld目录下,编译即可:

 1. 在非main包中go build 执行时,编译生成.a文件;go install可以看到生成在GOPATH/pkg下2. 在main包中go build执行时,生成main文件;go install可以看到生成再GOPATH/bin下

三、 包机制导入机制

  1. 如果一个main导入其他的包,包会被顺序导入
  2. 如果导入的包(pkg1)依赖其他的包(包pkg2),会首先导入pkg2,然后初始化pkg2中的常量与变量,如果pkg2中有init函数,会自动执行init
  3. 所有包导入完成后才会对main的常量和变量进行初始化,然后执行main中的init函数(如果有的话),最后执行main函数
  4. 如果一个包被导入多次实际上只会导入一次

go语言多package使用实战相关推荐

  1. 《Go语言从入门到实战》学习笔记(1)——Go语言学习路线图、简介

    非常有幸在<极客时间>上看到<Go语言从入门到实战>这门课程,本课程的作者给出了较为详细的学习路线图,具体如下: 学习路线图  学习目的 个人学习的目的主要是了解Go语言的基本 ...

  2. R语言可视化韦恩图实战:VENN DIAGRAM

    R语言可视化韦恩图实战:VENN DIAGRAM #韦恩图 # load Venn diagram package library("VennDiagram")# move to ...

  3. Go 语言从入门到实战

    <Go 语言从入门到实战> 的学习笔记,欢迎阅读斧正.感觉该专栏整体来说对有些后端编程经验的来说比无后端编程经验的人更友好. 数据类型 运算符 算数运算符 比较运算符 用 == 比较数组 ...

  4. R语言绘制空白图实战

    R语言绘制空白图实战 目录 R语言绘制空白图实战 #绘制空白图1 #绘制空白图2 #绘制空白图3

  5. R语言ggplot2可视化散点图实战:绘制基础散点图、为所有散点添加标签、只为大于阈值的散点添加标签

    R语言ggplot2可视化散点图实战:绘制基础散点图.为所有散点添加标签.只为大于阈值的散点添加标签 目录

  6. R语言导入SPSS文件实战

    R语言导入SPSS文件实战 目录 R语言导入SPSS文件实战 #导入SPSS文件的基本语法 #包的安装和导入

  7. R语言导入.dta文件实战

    R语言导入.dta文件实战 #导入.dta文件的基本语法 R的导入.dta文件最简单方法是使用haven库中的read_dta()函数. 此函数使用以下基本语法: data <- read_dt ...

  8. R语言Eta squared计算实战:Eta squared表示可以用模型中给定的变量解释的方差的比例、拟合方差分析模型(two-way ANOVA)、计算Eta Squared

    R语言Eta squared计算实战:Eta squared表示可以用模型中给定的变量解释的方差的比例.拟合方差分析模型(two-way ANOVA).计算Eta Squared 目录

  9. R语言KNN模型数据分类实战

    R语言KNN模型数据分类实战 目录 R语言KNN模型数据分类实战 #KNN基本原理 #案例分析 ​#数据集说明

  10. R语言White’s检验实战:检验回归模型中是否存在异方差性(heteroscedasticity)、发生了异常差(heteroscedasticity)问题如何解决

    R语言White's检验实战:检验回归模型中是否存在异方差性(heteroscedasticity).发生了异常差(heteroscedasticity)问题如何解决 目录

最新文章

  1. linux 多目录makefile,royalchen
  2. 清华大学软件学院院长王建民:以数字基建为契机,加强工业互联网大数据软件建设...
  3. 根据Forms名找出其所归属的权限组
  4. 从动力学角度看优化算法SGD:一些小启示
  5. Swift之深入解析如何在Swift中实现状态机
  6. 计算机视觉应用开发功能图,《计算机视觉算法:基于OpenCV的计算机应用开发》 —1.3 理解计算机图像...
  7. 蔡司数码视疲劳测试软件_居家办公期间,频繁使用电子数码产品小心患上这种眼病...
  8. 无代码开发到底是不是伪需求?
  9. php公司共享 管理,php – 管理几个共享重叠函数和类的代码库
  10. Unity的lua项目为Tolua# 编译云风版protobuf
  11. 5分钟学会五笔 (不用背口诀)
  12. 怎么在线制作软件的logo
  13. oracle am时间,oracle里to_date()如何转换am、pm时间
  14. 用c#二次开发的焊锡检测视觉系统
  15. 实验吧WEB CTF 猫抓老鼠 全网最简单易懂的解题方法
  16. [论文学习] - 2014ECCV - TCDCN
  17. ios 提醒事项和快捷指令,实现进度条功能
  18. 如何在工作中提升自己的学习能力
  19. 《LKD3粗读笔记》(6)内核数据结构
  20. HUST 1584 摆放餐桌

热门文章

  1. 11G_RAC扩容方案
  2. 疯狂的订餐系统-软件需求分析挑战之旅 【转】
  3. 远程主机强迫关闭了一个现有的连接.
  4. Three 之 three.js (webgl)shader 中 Texture 贴图 uv 坐标的相关简单说明,并简单测试 UV 重复旋转偏移效果
  5. Codeforces Round #609 (Div. 2) C. Long Beautiful Integer
  6. Android 内存剖析 – 发现潜在问题------比较好android博客
  7. PPC电影下载地址收集
  8. Moon Modeler v1.6.5功能和特点
  9. 微信小程序-小程序的宿主环境
  10. PHY--PDCCH