Go语言核心36讲
郝林
《Go并发编程实战》作者,前轻松筹大数据负责人
立即订阅
24139 人已学习
课程目录
已完结 54 讲
0/4登录后,你可以任选4讲全文学习。
开篇词+学习路线 (3讲)
开篇词 | 跟着学,你也能成为Go语言高手
免费
预习篇 | 写给0基础入门的Go语言学习者
50 | 学习专栏的正确姿势
模块一:Go语言基础知识 (6讲)
01 | 工作区和GOPATH
02 | 命令源码文件
03 | 库源码文件
04 | 程序实体的那些事儿(上)
05 | 程序实体的那些事儿(中)
06 | 程序实体的那些事儿 (下)
模块二:Go语言进阶技术 (16讲)
07 | 数组和切片
08 | container包中的那些容器
09 | 字典的操作和约束
10 | 通道的基本操作
11 | 通道的高级玩法
12 | 使用函数的正确姿势
13 | 结构体及其方法的使用法门
14 | 接口类型的合理运用
15 | 关于指针的有限操作
16 | go语句及其执行规则(上)
17 | go语句及其执行规则(下)
18 | if语句、for语句和switch语句
19 | 错误处理(上)
20 | 错误处理 (下)
21 | panic函数、recover函数以及defer语句 (上)
22 | panic函数、recover函数以及defer语句(下)
模块三:Go语言实战与应用 (27讲)
23 | 测试的基本规则和流程 (上)
24 | 测试的基本规则和流程(下)
25 | 更多的测试手法
26 | sync.Mutex与sync.RWMutex
27 | 条件变量sync.Cond (上)
28 | 条件变量sync.Cond (下)
29 | 原子操作(上)
30 | 原子操作(下)
31 | sync.WaitGroup和sync.Once
32 | context.Context类型
33 | 临时对象池sync.Pool
34 | 并发安全字典sync.Map (上)
35 | 并发安全字典sync.Map (下)
36 | unicode与字符编码
37 | strings包与字符串操作
38 | bytes包与字节串操作(上)
39 | bytes包与字节串操作(下)
40 | io包中的接口和工具 (上)
41 | io包中的接口和工具 (下)
42 | bufio包中的数据类型 (上)
43 | bufio包中的数据类型(下)
44 | 使用os包中的API (上)
45 | 使用os包中的API (下)
46 | 访问网络服务
47 | 基于HTTP协议的网络服务
48 | 程序性能分析基础(上)
49 | 程序性能分析基础(下)
尾声与思考题答案 (2讲)
尾声 | 愿你披荆斩棘,所向无敌
新年彩蛋 | 完整版思考题答案
Go语言核心36讲
登录|注册

03 | 库源码文件

郝林 2018-08-15
你已经使用过 Go 语言编写了小命令(或者说微型程序)吗?
当你在编写“Hello, world”的时候,一个源码文件就足够了,虽然这种小玩意儿没什么用,最多能给你一点点莫名的成就感。如果你对这一点点并不满足,别着急,跟着学,我肯定你也可以写出很厉害的程序。
我们在上一篇的文章中学到了命令源码文件的相关知识,那么除了命令源码文件,你还能用 Go 语言编写库源码文件。那么什么是库源码文件呢?
在我的定义中,库源码文件是不能被直接运行的源码文件,它仅用于存放程序实体,这些程序实体可以被其他代码使用(只要遵从 Go 语言规范的话)。
这里的“其他代码”可以与被使用的程序实体在同一个源码文件内,也可以在其他源码文件,甚至其他代码包中。
那么程序实体是什么呢?在 Go 语言中,程序实体是变量、常量、函数、结构体和接口的统称。
我们总是会先声明(或者说定义)程序实体,然后再去使用。比如在上一篇的例子中,我们先定义了变量name,然后在main函数中调用fmt.Printf函数的时候用到了它。
再多说一点,程序实体的名字被统称为标识符。标识符可以是任何 Unicode 编码可以表示的字母字符、数字以及下划线“_”,但是其首字母不能是数字。
从规则上说,我们可以用中文作为变量的名字。但是,我觉得这种命名方式非常不好,自己也会在开发团队中明令禁止这种做法。作为一名合格的程序员,我们应该向着编写国际水准的程序无限逼近。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Go语言核心36讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(53)

  • daydayyiday 置顶
    注意是核心36讲,不是三个月从入门到精通,建议可以先从教程预习一下https://tour.go-zh.org/welcome/1

    作者回复: 好,你这个留言可以作为精选了:)。从零基础怎么一步步走我已经画好图了,择日发布。

    2018-08-17
    2
    33
  • Dylan 置顶
    讲得很到位呢,之前因为想看以太坊的源码,自己已经啃了一遍Go语言,现在回过头来在跟着老师学习,受益匪浅呀~

    作者回复: 对大家有帮助就好!

    2018-08-15
    5
  • 松烽 置顶
    可以先看看郝爷的Go并发编程,真不错,很体系
    2018-08-15
    1
  • 婺华 置顶
    我也觉得这种学习方式挺好,是新的尝试,因为对于有点基础的同学,总比去看太过基础的东西来的有效率,讲到点子上,也是不错的
    2018-08-16
  • 咖啡色的羊驼
    看完本文加深的关键点:
    1.同一个文件夹下,包的声明语句需要相同,代表同一个包。
    2.包名不需要和其所在的文件夹名相同。
    3.首字母大小写来代表可见性,大写public/小写private
    4.模块级私有internal的使用姿势✔✔✔(这个厉害了,之前还不知道这玩意儿)

    回答下问题:
    1.import后路径最后一级相同,不一定会冲突。
    分为两种情况:
    a.如果文件夹下文件声明的包名相同,则肯定冲突,会报错redeclared。
    b.如果文件夹下文件声明的包名不同,也不会冲突。

    2.如果冲突,我能想到的解决方式:
    a.给包设置别名,调用的时候来区分开不同的package,比如:import(b "bbbb")

    b.导入的点操作,import(. "bbbb")。这样就可以直接调用bbbb下面的函数而不用再bbbb.funcname的方式调用。

    c.如果只是想引入某包并没有在代码中实际调用则可以这么处理来避免冲突:import(_ "bbbb")

    d.像第一问一样采取不同的包名声明,毕竟包名不一定要和文件夹名一样

    不过总的推荐还是方法a。
    2018-08-15
    61
  • dittolÖk
    还是不太适应这种学习方式

    作者回复: 你好,具体说说怎么不适应呢?

    2018-08-15
    51
  • 郝林
    一些非核心的知识我在本专栏里其实是一笔带过甚至舍弃的,我相信抓问题只要抓重点就能解决80%甚至95%,剩下的大家再稍微自己弥补一下就OK了,这样有自己的努力在里面效果也会更好。不过,为了让大家更好的通过本专栏学习,我会再出一篇指引性的文章供大家参考。
    2018-08-16
    28
  • 云学
    go语言有些地方设计的太坑了,感觉没有审美观,首字母大写这个在其他语言是用来表示类型的,它偏要独树一帜,看来还是python的哲学好!
    建议作者多给出一些最佳实践,不太习惯这种踩坑式教学,语言的第一感觉很重要,这些坑以附录的形式给出比较合适。

    作者回复: 你好,每个语言几乎都有自己风格和编程哲学,学以致用最重要,一些细节不用太在意。

    2018-08-15
    1
    7
  • 々雪虎々_卍
    1. 导入的包会出现冲突
    2. 从go语言的规范来看有几种避免的方法:
    Import declaration Local name of Sin

    import "lib/math" math.Sin
    import m "lib/math" m.Sin
    import . "lib/math" Sin
    import _ "lib/math"

    可以看出, 别名的方法比较好
    2018-09-27
    6
  • hb
    有一个疑惑,go install生成的一个.a文件的具体作用是什么?我在demo中导入的还是源码文件的Hello函数,我尝试把pkg目录下的.a删除,还是可以正常运行和编译
    2018-09-09
    6
  • Dkrxs
    我觉得这种学习方式挺好的,要是分享的在网上一搜一大把的那种demo什么的,买这个这个还有什么意义

    2018-08-15
    5
  • 金阳
    go语言学习从入门到放弃(开玩笑)…学了这几篇,有些概念还不是很熟悉,主要是之间的联系,希望后面能给出解答。这种教学方式,就像小时候背古诗,你们先死记硬背,意思怎么样先不要理解,背会再说,霸王硬上弓。
    2018-08-15
    5
  • Realm
    1 导入包时,import的是相对src的相对文件路径,使用包内的函数时,其限定符是:包名.函数名(),压根与程序的文件名没有啥关系.
    2 大写:Prubic;小写:private.

    作者回复: 说得很多,源码文件名是代码包内部的细节,不对外暴露。

    2018-08-15
    4
  • 飞吧蛐蛐
    会有冲突,解决方法:
    1、包的别名。
    2、如果第二个导入的包不被显示使用,可以使用匿名导入( 包的 _操作,只调用包的init()函数 )。
    3、可以使用 包的点操作。(使用点操作引入的包,调用函数时直接使用函数名即可)。
    4、修改包名。(如果库源码文件比较多,比较费劲)
    2018-10-15
    3
  • 萧末
    可以通过包别名的方式解决冲突,如果导入的包不显式使用可以采用匿名的方式导入包

    作者回复: 答得很好。

    2018-08-15
    3
  • leo
    老师好,对于包管理的问题,之前会遇到cycle的问题,报错信息也很少,是否有什么定位方法?

    作者回复: 你好,我记得现在go命令会报错的吧。

    2018-08-15
    3
  • Erico.Len
    第一次接触go,虽然大学学过C,第一次看的很焖不知道联系 照着敲代码 看到报错后分析问题 疑问就会豁然开朗 建议以后可以举例一些实际项目中会关联的问题 ,通过这节课我觉得可以体会到以后搭建项目中包和目录以及程序实体之间的联系。比如MVC这个怎么布置会更合理一些 本人刚学意见不知道是否合理 望老师谅解

    作者回复: MVC其实是一种设计模式组合,这在Java盛行的时代很流行。Java的很多Web框架都把这个组合模式实现了,然后提供完整的API给你。但是现在互联网尤其是移动互联网时代这就有些过时了,因为前端面向的端不只网页浏览器一个了,不适合再由写后端的人去搞了,所以前后端分离的做法开始流行起来,MVC这种前后端通吃的模式用的人就少了。建议你即使自己搞网站也不要用完整的MVC,这种模式现在看起来太重了,不太适合快节奏开发。

    2018-08-16
    2
  • dlili
    总结一下前三章的内容:
    1. go的组织结构:GOROOT,GOPATH,GOBIN其中日常接触最多的是GOPATH,它是go的工作空间,主要有三个目录,src存储我们编写的工程源码(go 以包为代码组织单位,因为包名和目录名同名,因此我们可以认为一个目录就是一个包),bin是存放可执行文件的目录,比如beego框架下的脚手架bee.exe,这是由go get/install之后编译生成的。pkg是归档文件(静态链接库)存储的地方,我们使用go get/install之后会在此目录下生成相应的文件,以便我们在编写自己的程序时引用这些代码。

    2. 命令源码文件:其实就是程序的入口,这个入口可以理解为我们编写,组织程序的入口;也是go run的入口,在程序编译时会依据此命令源文件查找依赖的库文件(包)

    3. 库源码文件:可以理解成两部分,一部分是我们自己写的一些包,另一部分是我们go get获取的包;区别是我们在go build/run我们的命令源文件时,是否对这些包进行编译。

    对于包的导入规则,internal的用法需要掌握,这样更有利于组织代码,使程序体的访问权限得到更好的规范,有利于代码的安全稳定

    ps:老师可以把代码放到github上吗?这样更方便查看对比

    作者回复: 早就有了呀:https://github.com/hyper0x/Golang_Puzzlers

    2019-11-28
    1
  • ithunter
    为什么我在~/.zshrc里设置了
    export GOPATH=$HOME/GoLang:$HOME/git/go/Golang_Puzzlers
    然后执行了 source .zshrc,在执行go build puzzlers/article3/q1后,提示can't load package。只认到了$HOME/GoLang,认不到$HOME/git/go/Golang_Puzzlers

    作者回复: 先在当前的命令行下echo $GOPATH看看

    2018-09-02
    1
  • pebble
    demo4我这run老是提示 undefined hello,我自己写的代码如此,然后下载官方源码,一样的提示,难道我的关键有问题吗,还是我的运行命令不对,我的命令 go run puzzlers/article3/q1/demo4.go
    2018-08-24
    1
收起评论
53
返回
顶部