Go入门系列(八)包

RabbitMask · · 729 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

目录:
一、官方包
二、第三方包
三、自定义包

  • 概念

Go语言是使用包来组织源代码的,包(package)是多个 Go 源码的集合。
任何源代码文件必须属于某个包,同时源码文件的第一行有效代码必须是package pacakgeName 语句,通过该语句声明自己所在的包。

一、官方包

官方包,即在你安装go环境时,它已经存在于你的GOPATH/src目录下了。
在这个目录下完美可以看到很多眼熟的文件夹,均为我们前几个章节接触过的,这里简单介绍部分常用内置包,希望对Go语言可实现的基本功能形成一个基本认识:

1) fmt
fmt 包实现了格式化的标准输入输出,这与C语言中的 printf 和 scanf 类似。其中的 fmt.Printf() 和 fmt.Println() 是开发者使用最为频繁的函数。
2) io
这个包提供了原始的 I/O 操作界面。它主要的任务是对 os 包这样的原始的 I/O 进行封装,增加一些其他相关,使其具有抽象功能用在公共的接口上。
3) bufio
bufio 包通过对 io 包的封装,提供了数据缓冲功能,能够一定程度减少大块数据读写带来的开销。
在 bufio 各个组件内部都维护了一个缓冲区,数据读写操作都直接通过缓存区进行。当发起一次读写操作时,会首先尝试从缓冲区获取数据,只有当缓冲区没有数据时,才会从数据源获取数据更新缓冲。
4) sort
sort 包提供了用于对切片和用户定义的集合进行排序的功能。
5) strconv
strconv 包提供了将字符串转换成基本数据类型,或者从基本数据类型转换为字符串的功能。
6) os
os 包提供了不依赖平台的操作系统函数接口,设计像 Unix 风格,但错误处理是 go 风格,当 os 包使用时,如果失败后返回错误类型而不是错误数量。
7) sync
sync 包实现多线程中锁机制以及其他同步互斥机制。
8) flag
flag 包提供命令行参数的规则定义和传入参数解析的功能。绝大部分的命令行程序都需要用到这个包。
9) encoding/json
JSON 目前广泛用做网络程序中的通信格式。encoding/json 包提供了对 JSON 的基本支持,比如从一个对象序列化为 JSON 字符串,或者从 JSON 字符串反序列化出一个具体的对象等。
10) html/template
主要实现了 web 开发中生成 html 的 template 的一些函数。
11) net/http
net/http 包提供 HTTP 相关服务,主要包括 http 请求、响应和 URL 的解析,以及基本的 http 客户端和扩展的 http 服务。
通过 net/http 包,只需要数行代码,即可实现一个爬虫或者一个 Web 服务器,这在传统语言中是无法想象的。
12) reflect
reflect 包实现了运行时反射,允许程序通过抽象类型操作对象。通常用于处理静态类型 interface{} 的值,并且通过 Typeof 解析出其动态类型信息,通常会返回一个有接口类型 Type 的对象。
13) os/exec
os/exec 包提供了执行自定义 linux 命令的相关实现。
14) strings
strings 包主要是处理字符串的一些函数集合,包括合并、查找、分割、比较、后缀检查、索引、大小写处理等等。
strings 包与 bytes 包的函数接口功能基本一致。
15) bytes
bytes 包提供了对字节切片进行读写操作的一系列函数。字节切片处理的函数比较多,分为基本处理函数、比较函数、后缀检查函数、索引函数、分割函数、大小写处理函数和子切片处理函数等。
16) log
log 包主要用于在程序中输出日志。

包的导入规则为:

import "包1"
import "包2"

or

import(
    "包1"
    "包2"
    …
)

此外关于包的导入还有两个标识符:

  • 匿名导入:_
    只导入包但不使用包内类型和数值,即只希望导入包,而不使用任何包内的结构和类型,也不调用包内的任何函数时,可以使用匿名导入包。
import (
    _"fmt"
)
  • 包名省略:.
    即包导入之后在你调用这个包的函数时,你可以省略前缀的包名。
import (
    ."fmt"
)

接下来,我们来个综合实例,以渗透行业为需求,收集系统信息:

import (
    "log"
    "os/user"
)
func main() {
    u, _ := user.Current()
    log.Println("用户名:", u.Username)
    log.Println("用户id", u.Uid)
    log.Println("用户主目录:", u.HomeDir)
    log.Println("主组id:", u.Gid)
    s, _ := u.GroupIds()
    log.Println("用户所在的所有组:", s)
}
#输出
2020/03/17 13:04:10 用户名: GAMING\Administrator
2020/03/17 13:04:10 用户id S-1-5-21-288493977-1313606145-3801498405-500
2020/03/17 13:04:10 用户主目录: C:\Users\Administrator
2020/03/17 13:04:10 主组id: S-1-5-21-288493977-1313606145-3801498405-513
2020/03/17 13:04:10 用户所在的所有组: [S-1-5-32-544 S-1-5-21-288493977-1313606145-3801498405-513]

对了,顺便提一点,比起python,golang的编译要稳定许多,可轻松build我们想要的二进制文件,不需要借助第三方包打包,这个我们在后面会展开,先提一下。

二、第三方包

第三方包,顾名思义,来自非官方,目前的第三方包主要存在于GitHub。评价一个语言的社区活跃度,第三方包的数量与质量确实是一个很好的参考,也希望给golang更加壮大。
我们上个章节提到的MySQL和redis第三方包正是来自于GitHub,我们可以手动将第三方包下载到GOPATH/src目录下,或者如果使用Goland之类的IDE的话,它会协助自动下载并维护第三方包,前提你安装了git并配置了相关的环境变量。

关于Git的使用可以看之前发布的教程:https://www.jianshu.com/p/f5b45a1c2fb6

更多的第三方包内容我们不做展开,毕竟选择因人而异,后期我们根据需求拓展。

三、自定义包

  • 自定义本地包
    我们尝试修改上面的例子,将他封装一个包,名曰getinfo,将他丢到我们的GOPATH/src目录下:

然后我们本地做包引用,即可直接调用。适合团队内部使用,尤其是涉及复用封装。

package main

import "getinfo"

func main() {
    getinfo.GetInfo()
}
#输出
2020/03/17 13:29:48 用户名: GAMING\Administrator
2020/03/17 13:29:48 用户id S-1-5-21-288493977-1313606145-3801498405-500
2020/03/17 13:29:48 用户主目录: C:\Users\Administrator
2020/03/17 13:29:48 主组id: S-1-5-21-288493977-1313606145-3801498405-513
2020/03/17 13:29:48 用户所在的所有组: [S-1-5-32-544 S-1-5-21-288493977-1313606145-3801498405-513]
  • 自定义第三方包
    第三方包可不是某些群体的特权,我们当然也可以实现,在git教程中就提过与IDE的结合,这里当然也是可以的,我们借助IDE的GitHub发布功能完成上传同步 :

https://github.com/rabbitmask/getinfo

然后我们向上面一样调用第三方包:

package main

import (
    "github.com/rabbitmask/getinfo"
)

func main() {
    getinfo.GetInfo()
}
#输出
2020/03/17 16:43:06 用户名: GAMING\Administrator
2020/03/17 16:43:06 用户id S-1-5-21-288493977-1313606145-3801498405-500
2020/03/17 16:43:06 用户主目录: C:\Users\Administrator
2020/03/17 16:43:06 主组id: S-1-5-21-288493977-1313606145-3801498405-513
2020/03/17 16:43:06 用户所在的所有组: [S-1-5-32-544 S-1-5-21-288493977-1313606145-3801498405-513]

如果是Goland的话,第三方包已经维护到了GOPATH/src目录下:

希望在接下来的日子里,github.com/rabbitmask目录下可以给大家提供些真正有价值的轮子,/鞠躬

/补充

其实上文中有一处小错误,我决定不修复了,来当作反面教材讲一下。
在创建自定义本地包时,我放的目录并不是的GOPATH,而是GOROOT。
GOROOT为Go文件的安装目录,下面的src文件夹中就是我们的官方包,显然GOROOT路径是唯一的。
但GOPATH是我们的工作空间,有独立的src,它的路径并不是唯一的,而且是可以随时变更的,你可以理解成你本机的工作环境,你可以设置几个,来回切换。
此外,在goland中还提供了第三层环境,project gopath,顾名思义,它只对当前项目生效,你的项目会同时去以上三级环境中寻找所需要的包,尽可能多的独立环境,会让你的程序变得更加干净,全家桶棒呆!


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:RabbitMask

查看原文:Go入门系列(八)包

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

729 次点击  
加入收藏 微博
下一篇:2020-03-17
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传