当前位置:网站首页>Go项目目录结构介绍
Go项目目录结构介绍
2022-06-30 06:52:00 【段晓慢】
前言
一般的编程语言往往对工程(项目)的目录结构是没有什么规定的,但是Go语言却在这方面做了相关规定,下面我们就来聊聊Go语言在工程结构方面的有关知识。
在安装Go语言开发工具这篇文章里面我们提到了GOPATH这个环境变量,是一个路径,用来存放开发中需要用到的代码包,项目的构建主要是靠它来实现的,换而言之,如果想要构建一个项目,就需要将这个项目的目录添加到GOPATH中,多个项目直接可以使用;分隔,如果不配置GOPATH,即便是处于同一目录,代码之间也无法通过绝对路径相互调用。
目录结构
在进行Go语言开发的时候,我们的代码总是会保存在$GOPATH/src目录下,在经过go build、go install或go get等指令后,会将下载的第三方包源代码文件放在$GOPATH/src目录下,产生的二进制可执行文件放在$GOPATH/bin目录下,生成的中间缓存文件会被保存在$GOPATH/pkg目录下。
一个Go语言项目的目录一般包含以下三个子目录:
- src目录:放置项目和库的源文件;
- pkg目录:放置编译后生成的包/库的归档文件;
- bin目录:放置编译后生成的可执行文件;
三个目录中我们需要重点关注的是src目录,其他两个目录了解即可,下面来分别介绍一下这三个目录。
src目录
用于以包(package)的形式组织并存放Go源文件,这里的包与src下的每个子目录是一一对应,例如,若一个源文件被声明属于log包,那么它就应当保存在src/log目录中。并不是说src目录下不能存放Go源文件,一般在测试或演示的时候也可以把Go 源文件直接放在 src 目录下,但是这么做的话就只能声明该源文件属于 main 包了。正常开发中还是建议大家把 Go 源文件放入特定的目录中。
包是Go语言管理代码的重要机制,其作用类似于Java中的 package 和 C/C++ 的头文件。Go 源文件中第一段有效代码必须是package <包名> 的形式,如 package hello。
另外需要注意的是,Go语言会把通过go get 命令获取到的库源文件下载到 src 目录下对应的文件夹当中。
pkg目录
用于存放通过go install 命令安装某个包后的归档文件。归档文件是指那些名称以“.a”结尾的文件。
该目录与 GOROOT 目录(也就是Go语言的安装目录)下的 pkg 目录功能类似,区别在于这里的 pkg 目录专门用来存放项目代码的归档文件。
编译和安装项目代码的过程一般会以代码包为单位进行,比如 log 包被编译安装后,将生成一个名为 log.a 的归档文件,并存放在当前项目的 pkg 目录下。
bin 目录
与 pkg 目录类似,在通过go install 命令完成安装后,保存由 Go 命令源文件生成的可执行文件。在类 Unix 操作系统下,这个可执行文件的名称与命令源文件的文件名相同。而在 Windows 操作系统下,这个可执行文件的名称则是命令源文件的文件名加 .exe 后缀。
源文件
上面我们提到了命令源文件和库源文件,它们到底是什么呢?
- 命令源文件:如果一个 Go 源文件被声明属于 main 包,并且该文件中包含 main 函数,则它就是命令源码文件。命令源文件属于程序的入口,可以通过Go语言的go run 命令运行或者通过go build 命令生成可执行文件。
- 库源文件:库源文件则是指存在于某个包中的普通源文件,并且库源文件中不包含 main 函数。
不管是命令源文件还是库源文件,在同一个目录下的所有源文件,其所属包的名称必须一致的。
目前流行的项目结构
Go语言中也是通过包来组织代码文件,我们可以引用别人的包,也可以发布自己的包,但是为了防止不同包的项目名冲突,我们通常使用顶级域名来作为包名的前缀,这样就不担心项目名冲突的问题了。
注:因为不是每个个人开发者都拥有自己的顶级域名,所以目前流行的方式是使用个人的github用户名来区分不同的包。
上面这个是目前流行的通用的项目结构,那么在公司开发时的项目结构又是怎样的呢?
那么在了解项目的结构之后,大家就可以是$GOPATH/src目录下根据对应的项目结构进行Demo开发了。
边栏推荐
- 0基础转行软件测试,如何实现月薪9.5k+
- Servlet principle
- Pycharm shortcut key
- Never forget the original intention, and be lazy if you can: C # operate word files
- SOC项目AHB_SD_HOST控制器设计
- ETL为什么经常变成ELT甚至LET?
- Principle: webmvcconfigurer and webmvcconfigurationsupport pit avoidance Guide
- Ftplib+ tqdm upload and download progress bar
- Judge whether H5 is in wechat environment or enterprise wechat environment at both ends
- 银河麒麟初体验
猜你喜欢

【每日一题】535. TinyURL 的加密与解密

Bat 使用细节2

1.4 - 定点数与浮点数

Assembly language learning I (with stack co process, 32-bit registers and related instructions, to be continued 06/29)

1.5 - logical operation

0 basic job transfer software test, how to achieve a monthly salary of 9.5k+

Jingwei Hengrun won the 10ppm quality award of paccar group again

随机网络,无标度网络,小世界网络以及NS小世界的性能对比matlab仿真

InnoDB engine in MySQL

银河麒麟初体验
随机推荐
RT thread application
RT thread Kernel Implementation (V): timer
1.3 - 码制
1.2(补充)
1.4 - 定点数与浮点数
Write a C program to judge whether the system is large end byte order or small end byte order
判断h5在两端是在微信环境还是企业微信环境
Principle: webmvcconfigurer and webmvcconfigurationsupport pit avoidance Guide
明天!“移动云杯”大赛空宣会开播!
RT thread Kernel Implementation (VI): time slice
华泰炒股安全吗?我想网上开户。
Definition and use of ROS topic messages
sscanf 函数的使用
【json-tutorial】第一章学习笔记
Never forget the original intention, and be lazy if you can: C # operate word files
6、 Shopping ⻋ and orders
1.9 - Classification of memory
Notes: environment variables
KEIL - 下载调试出现“TRACE HW not present”
ETL为什么经常变成ELT甚至LET?