库源码文件:
不能被直接运行的源码文件,它仅用于存放程序实体,这些程序实体可以被其他代码使用。

代码包声明的基本规则:
  1. 同目录下的源码文件的代码包声明语句要一致。也就是说,它们要同属于一个代码包(package)。这对于所有源码文件都是适用的。
如果目录中有命令源码文件,那么其他种类的源码文件也应该声明属于main包。这也是能够成功构建运行它们的前提。
  2. 源码文件声明的代码包的名称可以与其所在的目录的名称不同。在针对代码包进行构建时,生成的结果文件的主名称与其父目录的名称一致。
对于命令源码文件,构建生成可执行文件的主名称会与其父目录的名称相同。

面试题:

1. 如何拆分命令源码文件到其他代码包?

 // demo5.go
package main import (
"36class/q5/lib"
"flag"
) var StudentName string func init() {
flag.StringVar(&StudentName, "name", "Default name", "Some description.")
} func main() {
flag.Parse()
lib5.Hello(StudentName)
}

在该命令源码文件中,增加了导入lib包,同时修改了main()函数。

再看下代码包文件:q5/lib/demo5_lib.go:

 // demo5_lib.go
package lib5 import (
"fmt"
) func Hello(StudentName string) {
fmt.Printf("Hello, %s!\n", StudentName)
}

该文件中的函数Hello()首字母大写,表示可以被其他以外的包使用(public),否则只能在包内使用(private)。

要注意的是,该代码包的包名特意设为lib5,那么在demo5.go中引用Hello函数时,就需要使用包名lib5,而不是导入时指定的目录名lib。

2. 代码包的导入路径必须与其所在目录的相对路径保持一致吗?

代码包导入路径可以和包名不一致,在使用的时候需要使用包名。
先使用lib的相对路径,安装前面提供的代码包:
go install 36class/q5/lib
该命令执行成功后,会在当前过去(GoPath)的pkg目录下,生成相应的归档文件,如:

pkg/windows_amd64/36class/q5/lib.a

注意:源码文件所在的目录相对于GOPATH下src目录的相对路径,就是它代码包导入路径,而实际使用时给定的限定符(如上述文件中的“lib5.”)必须要与它声明所属的代码包名称一致。
要么把 :
package lib5

改为:
package lib

然后使用lib.Hello,如果保持lib5不变,那么就在调用限定符时使用“lib5.Hello”。

3. 什么样的程序实体才可以被当前包外的代码引用?

名称的首字母为大写的程序实体才可以被当前包外的代码引用,否则它就只能被当前包内的其他代码引用。

4. 对于程序实体,还可以使用怎样的访问权限规则?

通过创建internal代码包让一些程序实体仅仅能被当前模块中的其他代码引用。

这被称为 Go 程序实体的第三种访问权限:模块级私有。

具体规则是: internal代码包中声明的公开程序实体仅能被该代码包的直接父包及其子包中的代码引用。

当然,引用前需要先导入这个internal包。

对于其他代码包,导入该internal包都是非法的,无法通过编译。

思考题:

Q1: 如果需要导入两个代码包,而这两个代码包的导入路径的最后一级是相同的,比如:dep/lib/flag和flag,那么会产生冲突吗?
A1: 会报错redeclared。

Q2: 如果会产生冲突,那么怎样解决这种冲突,有几种方式?

可以通过包别名的方式解决冲突,如果导入的包不显式使用可以采用匿名的方式导入包。

本学习笔记是仅为了总结自己学到的Go语言核心知识,方便以后回忆,文中部分内容摘录自极客时间的《Go语言核心36讲》专栏,如有侵权,请联系我删除。

[Golang学习笔记] 03 库源码文件的更多相关文章

  1. [Golang学习笔记] 02 命令源码文件

    源码文件的三种类型: 命令源文件:可以直接运行的程序,可以不编译而使用命令“go run”启动.执行. 库源码文件 测试源码文件 面试题:命令源码文件的用途是什么,怎样编写它? 典型回答: 命令源码文 ...

  2. memcached学习笔记——存储命令源码分析下篇

    上一篇回顾:<memcached学习笔记——存储命令源码分析上篇>通过分析memcached的存储命令源码的过程,了解了memcached如何解析文本命令和mencached的内存管理机制 ...

  3. Hadoop学习笔记(10) ——搭建源码学习环境

    Hadoop学习笔记(10) ——搭建源码学习环境 上一章中,我们对整个hadoop的目录及源码目录有了一个初步的了解,接下来计划深入学习一下这头神象作品了.但是看代码用什么,难不成gedit?,单步 ...

  4. memcached学习笔记——存储命令源码分析上篇

    原创文章,转载请标明,谢谢. 上一篇分析过memcached的连接模型,了解memcached是如何高效处理客户端连接,这一篇分析memcached源码中的process_update_command ...

  5. Laravel学习笔记之Session源码解析(上)

    说明:本文主要通过学习Laravel的session源码学习Laravel是如何设计session的,将自己的学习心得分享出来,希望对别人有所帮助.Laravel在web middleware中定义了 ...

  6. Sping学习笔记(一)----Spring源码阅读环境的搭建

    idea搭建spring源码阅读环境 安装gradle Github下载Spring源码 新建学习spring源码的项目 idea搭建spring源码阅读环境 安装gradle 在官网中下载gradl ...

  7. JUC.Lock(锁机制)学习笔记[附详细源码解析]

    锁机制学习笔记 目录: CAS的意义 锁的一些基本原理 ReentrantLock的相关代码结构 两个重要的状态 I.AQS的state(int类型,32位) II.Node的waitStatus 获 ...

  8. tornado 学习笔记6 Application 源码分析

    Application 是Tornado重要的模块之一,主要是配置访问路由表及其他应用参数的设置. 源代码位于虚拟运行环境文件夹下(我的是env),具体位置为env > lib>sit-p ...

  9. Laravel学习笔记之Session源码解析(下)

    说明:在中篇中学习了session的CRUD增删改查操作,本篇主要学习关闭session的相关源码.实际上,在Laravel5.3中关闭session主要包括两个过程:保存当前URL到session介 ...

随机推荐

  1. 沉淀,再出发:Java基础知识汇总

    沉淀,再出发:Java基础知识汇总 一.前言 不管走得多远,基础知识是最重要的,这些知识就是建造一座座高楼大厦的基石和钢筋水泥.对于Java这门包含了编程方方面面的语言,有着太多的基础知识了,从最初的 ...

  2. HTTP协议图--HTTP 报文首部之请求行、状态行

    1.请求行 举个栗子,下面是一个 HTTP 请求的报文: GET /index.htm HTTP/1.1 Host: sample.com 其中,下面的这行就是请求行, GET /index.htm ...

  3. Scala高阶函数

    1.作为参数的函数 函数可以作为一个参数传入到一个方法当中去 def main(args: Array[String]): Unit = { val myFunc1 =(x:Int) =>{ x ...

  4. 解析Java对象的equals()和hashCode()的使用

    解析Java对象的equals()和hashCode()的使用 前言 在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个.在多 ...

  5. [19/04/16-星期二] 注解机制(Annotation,区别于comment(传统意义上的注释))

    一.概念 作用: ——不是程序本身,可以对程序作出解释.(这一点和注释没什么区别) ——可以被其它程序(比如编译器)读取,这是区别于注释的最重要的一点. 格式: ——"@注释名" ...

  6. Kali-linux Gerix Wifi Cracker破解无线网络

    Gerix Wifi Cracker是另一个aircrack图形用户界面的无线网络破解工具.本节将介绍使用该工具破解无线网络及创建假的接入点. 9.3.1 Gerix破解WEP加密的无线网络 在前面介 ...

  7. leetcode 1.Two Sum 、167. Two Sum II - Input array is sorted 、15. 3Sum 、16. 3Sum Closest 、 18. 4Sum 、653. Two Sum IV - Input is a BST

    1.two sum 用hash来存储数值和对应的位置索引,通过target-当前值来获得需要的值,然后再hash中寻找 错误代码1: Input:[3,2,4]6Output:[0,0]Expecte ...

  8. Jenkins Gitlab持续集成打包平台搭建

    http://www.cnblogs.com/skyseraph/p/5695021.html 1. 相关概念 Jenkins Jenkins,一个用Java编写的开源的持续集成工具,提供了软件开发的 ...

  9. python文件操作指令

    原文地址:http://www.cnblogs.com/rollenholt/archive/2012/04/23/2466179.html 常用的文件操作指令: python中对文件.文件夹(文件操 ...

  10. HDU 1561 The more, The Better(树形dp之树形01背包)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1561 The more, The Better Time Limit: 6000/2000 MS (J ...