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()

完!
原文出自:小韩说课
微信关注:小韩说课

原文地址:http://blog.51cto.com/2980679/2309823

时间: 2024-10-14 16:57:36

Go语言的包管理的相关文章

R语言的包管理功能

现代的开发语言都已经不再是单一的编程语言和编译环境,而是一个网络化的分布式系统.通过包(packages)管理程序进行软件模块的安装.卸载.更新等操作. 包管理的思路从Linux操作系统而来,通过Debian的apt-get可以从全球数万个网站快速获取软件的最新版本.在Mac OS X上也可以通过MacPort或Brew进行软件包的管理.Java语言自己不带包管理程序,但可通过maven进行包的自动下载和编译.链接.nodejs是通过npm进行包管理.python通过pip进行包管理.这些都是在

Go语言之包管理

什么是 Go 语言中的包 我们在使用其他语言,比如 Java ,是有包的概念的.它是 Java 语言中组织我们的 Java 文件的一个概念,比如java.lang这个包,它里面有很多我们常用的类,比如 String.在 Go 语言中,包也是类似的概念.它是把我们的 Go 文件组织起来,可以方便进行归类.复用等, 比如 Go 内置的 net 包. net ├── http ├── internal ├── mail ├── rpc ├── smtp ├── testdata ├── textpro

一些常用系统或者语言的包管理工具

npm: node package manager, 是node.js的套件(package) 管理工具 类似: pear 是PHP的套件管理工具(可以用于安装php模块) ppm 是perl的套件管理工具 (可以用于安装pear模块) pip 是python的套件管理工具(可以用于安装python模块) 类似perl的ppm或者是php的pear安装npm后,使用npm install module_name指令即可安装新套件 npm可以让node.js的开发者,直接利用,扩充线上的套件库 安

解读C/C++应用包管理的Why和How-Github架构师

一.背景本文整理自Johannes Nicolai在JFrog 2019用户大会上的讲演<DevOps for Non-Hipsters(aka C/C++ programmers)>. Johannes Nicolai是Github的解决方案架构师,主要负责德语区的用户.他和很多制造业的用户(多数使用C/C++)交流,询问他们在DevOps或持续交付方面的挑战,通常会得到如下的描述:在嵌入式C/C++领域,花费几十个小时完成一个完整的DevOps流水线并不少见.为某一个提交运行单独的构建和测

[Todo]各种语言包管理工具

看到一篇文章不错: http://harttle.com/2015/05/29/pkg-manager.html 包管理和构建系统是现代的软件开发团队中必不可少的工具,也是Linux软件系统的常见组织方式. 现代编程语言大多给出了自己专用的包管理和构建系统,那么本文便来总结一下小编用过的那些包管理和构建系统. JavaScript 服务器端 Javascript 通常使用NPM作为依赖管理工具. 通过NPM提供的npm命令来进行依赖的下载.升级和移除. 通过package.json来定义软件包的

Linux之Redhat系列程序包管理

安装.升级和卸载应用软件是每个系统不可或缺的一部分:对于在企业使用越来越广泛的Linux操作系统而言,强大而简洁的程序包管理机制为工程师们带来了很大的便利:下文主要介绍在RedHat系列的系统上如何使用RPM/YUM/编译三种方式去管理程序包. 一.RPM程序包管理 PRM全称是Red Hat Package Manager(RedHat 包管理器).Linux RPM软件包的命名有一定的规律:名称-版本-修正版-类型.rpm 例如: RPM命令详解: 功能: 安装.卸载.升级.查询和数据库维护

Linux的rpm包管理

我们都知道,windows的程序无法直接在linux中运行,windows中大量的木马和病毒也无法被linux识别,所有的软件包都必须针对linux再做单独的开发. 软件包分类 源码包 (把源代码直接开放的包) 脚本安装包(源码包写一个安装界面,不需要手动安装) 二进制包(RPM包.系统默认包) 源码包的优点: 1.开源,如果有足够的能力,可以修改源代码 2.可以自由选择所需的功能 3.软件是编译安装,所以更加适合自己的系统,更加的稳定也效率更高 4.卸载方便 缺点: 1.安装步骤较多,尤其在安

linux软件包管理——rpm包管理

软件运行环境API:Application Programming Interface 应用程序接口(应用程序和操作系统之间的接口) 凡是符合该api标准的应用程序都可以在支持该api的操作系统上编译通过 程序源代码 --> 预处理 --> 编译 --> 汇编 --> 链接  静态编译:自身包含所有需要调用的库文件  动态编译:自身不包含,需要时调用共享库文件(.so文件)ABI:Application Binary Interface 应用程序二进制接口 规定了二进制文件的格式.

谢烟客---------Linux之程序包管理基础知识

内核不提供特定的功能:功能由程序提供 程序的格式,ABI Windows:EXE Linux:ELF 程序编译的过程: 源程序 --> 编译 --> 汇编代码 --> 汇编 --> 二进制程序 --> 链接 编译的分类: 静态编译: 将程序运行时依赖的库编译进程序 动态编译:编译后需要链接库,在程序运行时,依据链接找到共享的库 程序跨平台运行 1.库虚拟化,虚拟出对应平台的库和ABI;程序运行在库之上 1).Linux上运行WINE程序,即可虚拟出Linux程序运行所依赖的库