Skip to content

Latest commit

 

History

History
82 lines (57 loc) · 3.48 KB

006-something-about-package.md

File metadata and controls

82 lines (57 loc) · 3.48 KB

package 包的更多知识

包中常见的组成是函数,本章主题包括以下几部分:

  • 函数的开发
  • 匿名函数
  • 返回多元组
  • 返回值带名字
  • 函数作为参数
  • 包的开发
  • 私有和公有
  • 包中的init函数
  • 介绍一个复杂的包
  • 底层包,使用很广,开发者不会直接用到的包

go中所有的元素,最终都是以包的概念存在的

匿名函数,代码量很小, 聚焦于局部(local focus)

匿名函数太多,说明需要重新设计

go中的匿名函数也可以被称为闭包

函数返回值,如果可以尽可能给返回值取个名字

每个package都有一个init()函数,自动调用

查看一个package的信息,注释(文档)和实现(代码)都可以获取很多信息

实现一个优质的package,有以下规则可以参考一下:

  • 包中的元素有相关性,不相关的放不同包,也不要太琐碎
  • 自己写的包给其他用之前,自己要使用一段时间,并添加测试,减少意料之外的情况
  • 先想想使用包的用户有哪几类,让使用者方便的使用,不能出现她们无法解决的问题
  • 包暴露的函数尽量少,少意味着易理解,不容易出错,函数尽量自解释和短
  • 接口提升函数的使用,能用接口的地方尽量用,eg:函数参数和返回值
  • 更新一个包时,不要改变以前的逻辑和创建不兼容的东西,除非非常有必要
  • 开发一个新的包时,使用多个文件,将相似的任务和概念分组
  • 尽量遵从标准库中的规则,多读标准库源码
  • 不要创建一个已存在的包,但可以修改,创建自己的版本
  • 日志输出要提供开关,没人喜欢满屏日志
  • 函数名要简洁有表达力,站在使用者的角度来看
  • 新类型和使用这个类型的代码放一起
  • 包中要包含test,至少看起来更加专业
  • 不要写包,因为写包要花很多时间

包的第一点是无bug,第二点是文档

syscall

这个包一般很少直接调用,但作为底层包,她被大量包调用, go中如果不调用syscall包,基本上啥时候都做不了,所以熟悉strae和dtrace很重要

工作接近底层,会越多的用到这个包

就算是一个fmt.Println(),最后都是调用syscall里的操作去实现的, 而syscall里的操作又是和操作系统提供的系统调用是有映射关系的, 而这些系统调用又是硬件提供的功能

  • 发送一个http请求,最后是通过网络设备将数据传出去
  • 读写文件,最后是通过磁盘设备持久化或读取
  • 计算一个复杂表达式,最后是通过调度cpu 缓存 寄存器来实现的

所以说系统调用是根,是主干,所有的语言都是从根上去扩展,形成不同的产品。 如果说产品是一副画,那系统调用就是调料,而一幅画的用料是多少, 可以通过strace和dtrace来查看,也就是作者单独花一小结重点说明过的。

templates

go中有两种: text/template html/template, 两者不能同时使用,因为她们共享了包名template, 在某些特殊场景,需要同时使用两种,可以将其中一种起个别名

go中的template是一个文件或是字符串。

text的输出一般是在屏幕上显示,html的输出一般是在浏览器上显示。

这两个包都很复杂,都支持其他语言,这样可以构建更复杂的软件。

这个例子还用到了sql语句,sqlite3,http服务, 后面若要看web编程,可以重点看下这个html/template,确实很强大