Go语言的包管理
1 概述
Go 语言的源码复用建立在包(package)基础之上。包通过 package, import, GOPATH 操作完成。
2 main包
Go 语言的入口 main() 函数所在的包(package)叫 main,main 包想要引用别的代码,需要import导入!
3 包定义,package
Go 语言的包与文件夹一一对应,同一个目录下的所有.go文件的第一行添加 包定义,以标记该文件归属的包,演示语法:
package 包名
包需要满足:
- 一个目录下的同级文件归属一个包。
- 包名可以与其目录不同名。
- 包名为 main 的包为应用程序的入口包,其他包不能使用。
包可以嵌套定义,对应的就是嵌套目录,但包名应该与所在的目录一致,例如:
// 文件:foo/bar/tool.go中
package bar
// 可以被导出的函数
func FuncPublic() {
}
// 不可以被导出的函数
func funcPrivate() {
}
包中,通过标识符首字母是否大写,来确定是否可以被导出。首字母大写才可以被导出,视为 public 公共的资源。
4 导入包,import
要引用其他包,可以使用 import 关键字,可以单个导入或者批量导入,语法演示:
// 单个导入
import "package"
// 批量导入
import (
"package1"
"package2"
)
导入时,可以为包定义别名,语法演示:
import (
p1 "package1"
p2 "package2"
)
// 使用时
p1.Method()
以上测试请使用系统包测试。若需要导入自定义包,需要设置GOPATH环境变量。
4 GOPATH环境变量
import导入时,会从GO的安装目录(也就是GOROOT环境变量设置的目录)和GOPATH环境变量设置的目录中,检索 src/package 来导入包。如果不存在,则导入失败。
GOROOT,就是GO内置的包所在的位置。
GOPATH,就是我们自己定义的包的位置。
通常我们在开发Go项目时,调试或者编译构建时,需要设置GOPATH指向我们的项目目录,目录中的src目录中的包就可以被导入了:
例如,我么的项目目录为: D:\projects\goProject,那么我么就需要将我们的源代码放在 D:\projects\goProject\src 下,同时设置GOPATH为 D:\projects\goProject。设置GOPATH的方案有:
- windows 通过 系统->系统信息->高级系统设置->环境变量 中完成设置。
- windows 中通过 CMD 或者 powershell 也可以完成设置。通常是临时有效的,CMD或者powershell关闭失效!
CMD:
set GOPATH=D:\projects\goProject
set GOPATH 可以查看
powershell:
$env:GOPATH="D:\projects\goProject"
$env:GOPATH 可以查看
- linux 通过 /etc/profile 进行设置
5 init() 包初始化
可以在源码中,定义 init() 函数。此函数会在包被导入时执行,例如如果是在 main 中导入包,包中存在 init(),那么 init() 中的代码会在 main() 函数执行前执行,用于初始化包所需要的特定资料。例如:
包源码:
src/userPackage/tool.go
package userPackage
import "fmt"
func init() {
fmt.Println("tool init")
}
主函数源码:
src/main.go
package main
import (
"userPackage"
)
func main() {
fmt.Println("main run")
// 使用userPackage
userPackage.SomeFunc()
}
执行时,会先输出 “tool init”,再输出 “main run”。
如果仅仅需要导入包时执行初始化操作,并不需要使用包内的其他函数,常量等资源。则可以在导入包时,匿名导入:
import (
_ "userPackage"
)
使用下划线作为包的别名,会仅仅执行init()
完!
原文出自:小韩说课
微信关注:小韩说课
Go语言的包管理的更多相关文章
- Go语言:包管理基础知识
起因是,遇到一个问题: 经查阅资料,很可能跟包管理有关,之前有了解过忘了就再学一遍顺便解决问题. 学习资料: GO111MODULE 是个啥? - 知乎 (zhihu.com) go mod使用 - ...
- go包管理
摘自: http://blueskykong.com/2019/02/18/go-dep-1/ https://www.cnblogs.com/apocelipes/p/10295096.html#v ...
- Go的包管理工具(一)
在前面转载了系列文章:Golang 需要避免踩的 50 个坑,总得来说阅读量都挺大.今天这篇文章,咱们一起聊聊Go的依赖包管理工具. 背景 每一门语言都有其依赖的生态,当我们使用Java语言的时候,使 ...
- Go语言包管理工具dep
什么是dep? dep和go,在一定程度上相当于maven之于Java,composer之于PHP,dep是go语言官方的一个包管理工具. 相比较go get而言,dep可以直接给引入的第三方包一个专 ...
- 《快学 Go 语言》第 16 课 —— 包管理 GOPATH 和 Vendor
到目前位置我们一直在编写单文件代码,只有一个 main.go 文件.本节我们要开始朝完整的项目结构迈进,需要使用 Go 语言的模块管理功能来组织很多的代码文件. 细数 Go 语言的历史发展,模块管理经 ...
- Go语言包管理工具Glide
Go语言包管理工具用于管理Go项目的库和库的依赖引用. 包管理工具普遍会在Go项目根目录生成Vendor文件夹并自动下载该Go项目需要的库. Go语言有很多开源的包管理工具,这里主要介绍Glide ...
- [Todo]各种语言包管理工具
看到一篇文章不错: http://harttle.com/2015/05/29/pkg-manager.html 包管理和构建系统是现代的软件开发团队中必不可少的工具,也是Linux软件系统的常见组织 ...
- Node.js包管理器Yarn的入门介绍与安装
FAST, RELIABLE, AND SECURE DEPENDENCY MANAGEMENT. 就在昨天, Facebook 发布了新的 node.js 包管理器 Yarn 用以替代 npm .咱 ...
- Python黑帽编程1.3 Python运行时与包管理工具
Python黑帽编程1.3 Python运行时与包管理工具 0.1 本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks Attack and ...
随机推荐
- 设计模式(16) 观察者模式(OBSERVER)C++实现
意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 动机: 将一个系统设计成一系列相互协作的类有一个常见的副作用:需要维护相关对象之间的一 ...
- 浅析VS2010反汇编
第一篇 1. 怎样进行反汇编 在调试的环境下,我们能够很方便地通过反汇编窗体查看程序生成的反汇编信息. 例如以下图所看到的. 记得中断程序的运行,不然看不到反汇编的指令 看一个简单的程序及其生成的汇编 ...
- 在windows下解压缩rar文件
这是一篇比较无聊的博文.只是给博客除草的. 我从我的移动硬盘里翻出来了一堆电子书,从哪拿到的我忘了,但是都打在rar的压缩包里,这让我查找起来非常不方便.前几天找某本书看,就没有查到,又百度到的下载地 ...
- iOS js
[webView stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"idNumber\" ...
- Guava包学习--EventBus
之前没用过这个EventBus,然后看了一下EventBus的源码也没看明白,(-__-)b.反正大概就是弄一个优雅的方式实现了观察者模式吧.慢慢深入学习一下. 观察者模式其实就是生产者消费者的一个变 ...
- Dubbo特性
dubbo.properties Dubbo 将自动加载 classpath 根目录下的dubbo.properties,可以通过JVM启动参数 -Ddubbo.properties.file=xxx ...
- 【QT】QString类型转换为const char*(toLatin1)
Qstring str = "helloworld"; char *s; QByteArray ba = str.toLatin1(); s = ba.data(); toLati ...
- CentOS7图文安装教程
CentOS 7下载: CentOS 7只提供64位版本,虽然有不少国内镜像节点,不过还是觉得通过BT下载是不错的选择.镜像大小6.7G,联通20M光纤下载,不到小时.以下是中国大陆的下载地址列表: ...
- 部署Jar包到远程Maven仓库
在使用maven开发工程时,模块A可能会依赖模块B的jar包,如果两个模块都是在一个工程里,只需要在模块A的pom文件中加入模块B的依赖信息,模块A就可以加载模块B的jar包.但如果模块A与模块B在不 ...
- 验证码帮助类【CaptchaHelper 】
GDI+:Graphics Device Interface Plus也就是图形设备接口,提供了各种丰富的图形图像处理功能;在C#.NET中,使用GDI+处理二维(2D)的图形和图像,使用Direct ...