包中常见的组成是函数,本章主题包括以下几部分:
- 函数的开发
- 匿名函数
- 返回多元组
- 返回值带名字
- 函数作为参数
- 包的开发
- 私有和公有
- 包中的init函数
- 介绍一个复杂的包
- 底层包,使用很广,开发者不会直接用到的包
go中所有的元素,最终都是以包的概念存在的
匿名函数,代码量很小, 聚焦于局部(local focus)
匿名函数太多,说明需要重新设计
go中的匿名函数也可以被称为闭包
函数返回值,如果可以尽可能给返回值取个名字
每个package都有一个init()函数,自动调用
查看一个package的信息,注释(文档)和实现(代码)都可以获取很多信息
实现一个优质的package,有以下规则可以参考一下:
- 包中的元素有相关性,不相关的放不同包,也不要太琐碎
- 自己写的包给其他用之前,自己要使用一段时间,并添加测试,减少意料之外的情况
- 先想想使用包的用户有哪几类,让使用者方便的使用,不能出现她们无法解决的问题
- 包暴露的函数尽量少,少意味着易理解,不容易出错,函数尽量自解释和短
- 接口提升函数的使用,能用接口的地方尽量用,eg:函数参数和返回值
- 更新一个包时,不要改变以前的逻辑和创建不兼容的东西,除非非常有必要
- 开发一个新的包时,使用多个文件,将相似的任务和概念分组
- 尽量遵从标准库中的规则,多读标准库源码
- 不要创建一个已存在的包,但可以修改,创建自己的版本
- 日志输出要提供开关,没人喜欢满屏日志
- 函数名要简洁有表达力,站在使用者的角度来看
- 新类型和使用这个类型的代码放一起
- 包中要包含test,至少看起来更加专业
- 不要写包,因为写包要花很多时间
包的第一点是无bug,第二点是文档
这个包一般很少直接调用,但作为底层包,她被大量包调用, go中如果不调用syscall包,基本上啥时候都做不了,所以熟悉strae和dtrace很重要
工作接近底层,会越多的用到这个包
就算是一个fmt.Println(),最后都是调用syscall里的操作去实现的,
而syscall里的操作又是和操作系统提供的系统调用
是有映射关系的,
而这些系统调用
又是硬件提供的功能
- 发送一个http请求,最后是通过网络设备将数据传出去
- 读写文件,最后是通过磁盘设备持久化或读取
- 计算一个复杂表达式,最后是通过调度cpu 缓存 寄存器来实现的
所以说系统调用是根,是主干,所有的语言都是从根上去扩展,形成不同的产品。 如果说产品是一副画,那系统调用就是调料,而一幅画的用料是多少, 可以通过strace和dtrace来查看,也就是作者单独花一小结重点说明过的。
go中有两种: text/template html/template, 两者不能同时使用,因为她们共享了包名template, 在某些特殊场景,需要同时使用两种,可以将其中一种起个别名
go中的template是一个文件或是字符串。
text的输出一般是在屏幕上显示,html的输出一般是在浏览器上显示。
这两个包都很复杂,都支持其他语言,这样可以构建更复杂的软件。
这个例子还用到了sql语句,sqlite3,http服务, 后面若要看web编程,可以重点看下这个html/template,确实很强大