Golang编程的工程管理

                             作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.工作区概述

1>.GOROOT和GOPATH

  GOROOT:
  GOROOT的值应该是安装Go的根目录。   GOPATH:
    我们需要将工作区的目录路径添加到环境变量GOPATH中。否则,即使处于同一个工作区(事实上,未被加入GOPATH中的目录不应该称为工作区),代码之间也无法通过绝对代码包路径调用。
    在实际开发环境中,工作区可以只有一个,也可以有多个,这些工作区的目的路径都需要添加到GOPATH中。与GOROOT意义,我们应该确保GOPTAH一直有效。   温馨提示:
    GOPATH中不要包含Go语言的根目录(GOROOT),以便将Go语言本身的工作区通用户工作区严格分开。
    通过Go工具中的代码获取命令go get,可将指定项目的源码下载到我们在GOPATH中设定的第一个工作区中,并在其中完成编译和安装。

2>.GOPATH工作区的目录结构说明

  一般情况下,Go源码文件必须放在工作区中。但是对于命名源码文件来说,这不是必须的。工作区其实就是一个对应于特定工厂的目录,它应该包含三个子目录,即src目录,pkg目录和bin目录。

  接下来我们对GOPATH指定的工作目录的三个子目录功能分别进行说明:
    src目录:
      用于以代码包的形式组织并保存Go源码文件,这里的代码包与src下的子目录一一对应。
      例如,若一个源码文件被声明属于代码包log,那么它就应当保存在src/log目录中。
      当然,你也可以把Go源码文件直接放在src目录下,但这样Go源码文件就只能被声明属于main代码包了。
      除非用于临时测试或演示,一般还是建议把Go源码文件放入特定的代码中。     pkg目录:
      用于存放通过go install命令安装后的代码包的归档文件,前提是代码包中必须包含Go库源码文件。另外,归档文件是指那些名称以".a"结尾的文件。
      该目录与GOROOT目录下的pkg目录功能类似。区别在于,工作区中的pkg目录专门用来存放用户代码的归档文件。
      编译和安装用户代码的过程一般会以代码包为单位进行。比如log包被编译安装后,将生成一个名为log.a的归档文件,并存放在当前工作区的pkg目录下的平台相关目录中。     bin目录:
      与pkg目录类似,在通过go install命令完成安装后,保存由Go命令源码文件生成的可执行文件。
      在类Unix操作系统下,这个可执行文件一般来说名称与源码文件的主文件名相同。
      而在windows操作系统下,这个可执行文件的名称则是源码文件主文件名加".exe"后缀。     目录src用于包含所有的源代码,是Go命令行工具一个强制的规则,而pkg和bin则无需手动创建,如果必要Go命令行工具在构建过程中会自动创建这些目录。

 

二.命令源码文件,库源码文件和测试源码文件的区别

  命名源码文件:
    指的是声明属于main代码包并且包含无参数声明和结果声明的main函数的源码文件。
    这类源码文件是程序的入口,它们可以独立运行(使用go run命令),也可以通过go build或go install命令得到相应的可执行文件。
    综上所述,我们可以总结为:如果一个源码文件被声明属于main代码包,且该文件中包含无参数声明和结果声明的main函数,则他就是命名源码文件。命名源码文件可通过go run命令直接运行。
  库源码文件:
    指的是在于某个代码包中的普通源码文件。
    通常,库源码文件声明的包名会与它直接所述的代码包(目录)名一致,且库源码文件中不包含无参数声明和无结果声明的main函数。

  测试源码文件:
    测试源码文件是一种特殊的库文件,可以通过go test命令运行当前代码包下的所有测试源码文件。成为测试源码文件中的充分条件有以下两个:
      (1)文件名需要以"_test.go"结尾;
      (2)文件中需要至少包含一个名称以Test开头或Benchmark开头,且拥有一个类型为*testing.T或*testing.B的参数的函数(testing.T和testing.B是两个结构体类型。而*testing.T和*testing.B则分别为前两者的指针类型。它们分别是功能测试和基准测试所需的);

  Go代码的文本文件需要以UTF-8编码存储。如果源码文件中出现了非UTF-8编码的字符,那么在运行,编译或安装的时候,Go命令会抛出"illegal UTF-8 sequence"错误提示。

三.多文件编程

1>.blog包中的"login.go"文件

package blog

import (
"fmt"
) /*
函数名称首字母大写可以被其它包访问
*/
func Login() {
fmt.Println("login successful")
} /*
函数名称首字母小写,不可以被其它包访问
*/
func sayHello() {
fmt.Println("你瞅啥?")
} /*
函数名称首字母大写可以被其它包访问
*/
func SayHello() {
fmt.Println("瞅你咋地")
}

2>.yinzhengjie包中的"11.工程管理.go"文件

package main

import (
"blog"
) func main() {
blog.Login()
blog.SayHello()
}

3>.调用关系如下图所示

Golang编程的工程管理的更多相关文章

  1. Go语言 函数,工程管理

    Go语言 函数,工程管理 1.无参无返回值函数的使用 package main import "fmt" func main() { // 无参无返回值函数的调用:函数名() fu ...

  2. make工程管理器

    1.概述 大型程序中,人们希望工具自动识别修改的文件,而且不需要输入冗长的命令,就可以进行编译链接等操作,于是make工程管理器应运而生. make可以自动识别文件时间戳,只处理修改的文件: make ...

  3. golang编程之我见

    golang编程之我见 学习了两个月的golang,语法算是基本掌握了,从一个C++程序员的角度,提出自己的几个看法吧. 1,没有一个好的包管理工具. 我在公司用的是glide的包管理,这个工具的好处 ...

  4. 使用BLADE构建c++工程管理

    使用BLADE构建c++工程管理 字数764 阅读2753 评论2 喜欢4 一. c++工程依赖管理 之前在百度一直使用comake2构建c++项目,十分方便.免去了手写Makefile的痛苦,很多项 ...

  5. emacs工程管理,cedet ede插件自动构建Make,Automake

    鉴于自己一直都是在做客户端开发方面的工作,服务端很多知识都随着时间淡忘了,最近有一个计划,用一些时间补一下基础.所以早上很早就起床,花了一点时间大致浏览了一下BSD socket的相关API,然后用G ...

  6. Makefile 工程管理

    Makefile 工程管理 Makefile 规则 --变量 在Makefile中,用户除了可以自己定义变量外,还可以使用存在系统已经定义好的默认变量 $^:代表所有的依赖文件 $@:代表目标 $&l ...

  7. 编程实战——电影管理器之界面UI及动画切换

    编程实战——电影管理器之界面UI及动画切换 在前文“编程实战——电影管理器之利用MediaInfo获取高清视频文件的相关信息”中提到电影管理器的目的是方便播放影片,在想看影片时不需要在茫茫的文件夹下找 ...

  8. 学习总结:工程管理与makefile

    工程管理与makefile 一.为什么需要makefile和make 一个工程中的源文件可能很多,按照类型.功能.模块分别放在若干个目录中,为了有效地管理软件工程,更高效地编译整个工程,需要用到mak ...

  9. go语言基础之工程管理和工作区介绍

    1.工程管理 在实际的开发工作中,直接调用编译器进行编译和链接的场景是少而又少,因为在工程中不会简单到只有一个源代码文件,且源文件之间会有相互的依赖关系.如果这样一个文件一个文件逐步编译,那不亚于一场 ...

随机推荐

  1. layui弹窗全屏显示

    var index =layer.open({ id: 'id', type: 2, area: ['100%', '100%'], fix: false, maxmin: true, shadeCl ...

  2. python 顺序执行任务

    #!/usr/bin/python import os import time start_command="sh start-etl.sh " es_mac_confPath = ...

  3. 「AHOI2014/JSOI2014」奇怪的计算器

    「AHOI2014/JSOI2014」奇怪的计算器 传送门 我拿到这题首先是懵b的,因为感觉没有任何性质... 后来经过同机房dalao的指导发现可以把所有的 \(X\) 放到一起排序,然后我们可以发 ...

  4. 【网摘】监控 div 的内容变化

    数据是动态加载而来,而当无数据时,提示一下暂无数据.而数据是可以动态在当前页面即时添加的,故在无数据时所做提示,需要隐藏,所以找了这个方法.成功在动态添加数据后,暂无数据的提示没有了. if($(&q ...

  5. C# Lambda排序

    1.按照多个字段进行排序:xxxList.OrderBy(c => c.RoadCode).ThenBy(c => c.Qdzh),表示先按照RoadCode字段进行排序再按照Qdzh字段 ...

  6. vmware 因误删Linux 虚拟机磁盘,无法启动处理方法

    有可能我们在做了以下误操作,导致Linux系统无法启动: 1). 磁盘损坏或虚拟机磁盘被我们删除了,而fstab文件没有更新: 2). 由于误操作或其它原因使动态库错误. 1. 首先准备好系统安装盘, ...

  7. Codeforces Global Round 4E(字符串,思维)

    #include<bits/stdc++.h>using namespace std;string s,a,b;int main(){ cin>>s; int n=s.size ...

  8. android 简单列表对话框(AlertDialog.Builder().setItems())

    ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ...

  9. get方法和load方法的区别

    get方法的特点    get方法采用的是立即检索策略(查询):执行到这行的时候,马上发送SQL查询    get方法查询后返回的是真实对象的本身   load方法的特点    load方法采用的是延 ...

  10. C/C++ - 多线程

    前几天简单对C和C++中的创建多线程的函数进行了测试,这篇随笔就简单介绍一下创建线程的相关函数. C中三个创建线程函数:pthread_create()._beginthread().CreateTh ...