问题一、Go使用Package组织源码的好处是什么?

1.任何源码属于一个包

2.用包组织便于代码的易读和复用

问题二、Go语言中Package的种类

Go语言中存在两种包、一种是可执行程序的包、一种是类库函数的包。

可执行程序的包,编译完成后会生成一个可执行文件、静态库的包编译之后会生成一个.a为后缀的文件,自己不能执行只能被可执行包引用。

可执行程序的包必须以main作为包名,静态库的包名没有要求。

例如下面的实例:landlords存在如下几层结构 dal层、logic层、main以及proto层

可以看到编辑后的结果是,生成了一个db.a数据库访问的库、redis.a 缓存访问的库、logic.a 业务逻辑层的库 以及一个proto.a 协议层的库(websocket.a 是由于引用了github.com下面的包),main包最终编译成了一个可执行文件。

main包和其他类库通过静态链接,最终形成的可执行文件是没有任何外部依赖的。

补充:如何生成一个静态库的包。

打比方我创建了如下的项目,现在有这样一个包,我想要在main里面引用它。

必须使用 go install 命令,生成一下package,发现报错了。因为我没有配置gopath,所以命令报错了。

还有一个关键原因就是,我这个项目不是建立在GoPath下Src目录的,所以go install就用不了。

这也是问题的关键,就是我们在创建项目的时候,需要先配置一个GoPath加入到环境变量当中,然后里面新建三个文件夹src、pkg以及bin文件夹,然后在src下面建立自己的项目。

我把改项目,放到了一个GoPath的src目录下,重新go install之后,在对应的pkg文件夹下生成了 calc.a文件,如图所示。

然后我们就可以在main中引用这个包了,如下:

package main

import (
"PackageDemo/Calc"
"fmt"
) func main(){
var a,b int = ,
var add = Calc.Add(a,b)
var min = Calc.Min(a,b)
fmt.Println("Add result:",add)
fmt.Println("Min result",min)
}

问题三、包引用和init函数的执行顺序问题。

一个包引用另一个包的初始化顺序,像下面的这个流程,main引用了add包,add包引用了sub包。

是从底层还是初始化的。

package add

import (
"fmt"
"PackageDemo/sub"
) func init(){
fmt.Println("我是add包的init函数")
} func Add(){
sub.Sub()
}

  

package sub

import "fmt"

func init(){
  fmt.Println("我是sub包的init函数")
} func Sub(){
  fmt.Println("")
}

  

package main

import (
  "fmt"
  "PackageDemo/add"
) func init(){
  fmt.Println("我是Main里面的init函数")
} func main(){
  add.Add()
}

结果:

我是sub包的init函数

我是add包的init函数

我是Main里面的init函数

 

Go语言中的Package问题的更多相关文章

  1. Java 语言中 Enum 类型的使用介绍

    Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常 ...

  2. 浅谈Java语言中ArrayList和HashSet的区别

    Java语言中ArrayList和HashSet的区别 2019-04-10   13:22:49 一.基本区别 首先一起看个实例,其代码如下: package com.MrZ_baby.com; i ...

  3. 浅谈Java语言中try{}catch{}和finally{}的执行顺序问题

    浅谈Java语言中try{}catch{}和finally{}的执行顺序问题 2019-04-06  PM  13:41:46  1. 不管有没有出现异常,finally块中代码都会执行: 2. 当t ...

  4. Go语言中的byte和rune区别、对比

    Go语言中byte和rune实质上就是uint8和int32类型.byte用来强调数据是raw data,而不是数字:而rune用来表示Unicode的code point.参考规范: uint8 t ...

  5. [转]Go语言中的make和new

    前言 本文主要给大家介绍了Go语言中函数new与make的使用和区别,关于Go语言中new和make是内建的两个函数,主要用来创建分配类型内存.在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的 ...

  6. Go语言中的UDP应用

    Go语言中的UDP应用 Go语言中使用UDP是很方便的,net包提供了UDP和TCP的功能,这里使用UDP做了一个UDP广播,然后接收各个设备的返回信息.实现起来很快,总体感觉比使用C#中的UDP更优 ...

  7. Go 语言中,有时 nil 并不是一个 nil

    今天,我遇到了一个 Go FAQ.首先,作为一个小小的 Go 语言测验,看看您是否在 Go playground 中运行该程序之前就能推断出它应该打印出的内容(我已经将程序放在侧边栏中,以防它在 Go ...

  8. 在 Go 语言中,我为什么使用接口

    强调一下是我个人的见解以及接口在 Go 语言中的意义. 如果您写代码已经有了一段时间,我可能不需要过多解释接口所带来的好处,但是在深入探讨 Go 语言中的接口前,我想花一两分钟先来简单介绍一下接口. ...

  9. C语言中,头文件和源文件的关系(转)

    简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...

随机推荐

  1. HDU 1150 Machine Schedule (最小覆盖,匈牙利算法)

    题意: 有两台不同机器A和B,他们分别拥有各种运行模式1~n和1~m.现有一些job,需要在某模式下才能完成,job1在A和B上需要的工作模式又可能会不一样.两台机器一开始处于0模式,可以切换模式,但 ...

  2. 一种从JSON数据创建Java类的高效办法

    <一种从JSON数据创建Java类的高效办法> 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs JSON格式的数据经常会遇到,比如调用Web服 ...

  3. 纯CSS3编写的面包屑导航收集

    整理了10个纯CSS3制作的面包屑导航,这些都是通过CSS3来编写,十分方便,而且实用.有些文章附有教程,大家可以研究学习一下. 漂亮面包屑导航 查看网站 扁平化面包屑导航 查看网站 圆形风格面包屑导 ...

  4. SQL远程备份

    原文:SQL远程备份 set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go   -- ====================================== ...

  5. 如何查找僵尸进程并Kill之,杀不掉的要查看父进程并杀之

    转自:如何查找僵尸进程并Kill之,杀不掉的要查看父进程并杀之 用ps和grep命令寻找僵尸进程#ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'命令注解:-A ...

  6. (整理)MySQL_REHL6.5 安装MySQL5.5

    1 根据系统选择Mysql版本 https://dev.mysql.com/downloads/mysql/5.5.html?os=31&version=5.1 在命令行的方式下,REHL/C ...

  7. 出现error: stray ‘\357’ in program的根源

    分类: 编程语言/ C#/ 文章 这次又遇到这个这种问题,想找到它的根源.找到一个表格: The characters at a glance Here are all the printable c ...

  8. ibatis.net:第二天,Hello,World ?

    背景 本文的内容全部来自于官方的文档,此处仅仅为了强化记忆. 项目结构 Properties.config <?xml version="1.0" encoding=&quo ...

  9. SpringMVC工作原理详解

    先来看一下什么是 MVC 模式 MVC 是一种设计模式. MVC 的原理图如下: SpringMVC 简单介绍 SpringMVC 框架是以请求为驱动,围绕 Servlet 设计,将请求发给控制器,然 ...

  10. jquery ajax contentType设置

    默认get方法没有contentType,post方法的contentType为:application/x-www-form-urlencoded; charset=UTF-8 (1) 设置成app ...