网站首页 > 技术文章 正文
大家好,我是 polarisxu。
说起 Go 的优点,很多人会提到 Go 拥有强大的标准库,比如开发一个 HTTP 服务,几行代码就搞定。不过,如果是一个 PHPer 转到 Go,又会觉得 Go 标准库不够便利,很多东西都需要自己二次封装。这其实是一个取舍的问题。
Go 官方也在不断完善、优化标准库,在坚持一定原则的基础上,尽可能让标准库好用、易用。今天就看看 Go1.17 中,官方在这方面做了哪些改进。
01 time 包
Unix 时间戳,大家知道单位是什么吗?Java 或 JavaScript 的同学大概率会回答是毫秒,因为这两门语言提供获取“时间戳”的方法,单位是毫秒。但实际上,标准的 Unix 时间戳,单位是秒,标准定义是:
Unix 时间戳是从 1970 年 1 月 1 日(UTC/GMT 的午夜)开始所经过的秒数,不考虑闰秒。
正因为如此,Go 标准库 time 包提供获取时间戳的方法是 Unix(),单位是秒:
// Unix returns t as a Unix time, the number of seconds elapsed
// since January 1, 1970 UTC. The result does not depend on the
// location associated with t.
// Unix-like operating systems often record time as a 32-bit
// count of seconds, but since the method here returns a 64-bit
// value it is valid for billions of years into the past or future.
func (t Time) Unix() int64
在和客户端/前端协商 API 时,一定要注意时间戳单位的问题。
为了方便,Go1.17 增加加了 Time.UnixMilli 方法,返回 Unix 时间戳的毫秒数,同时也提供了 UnixNano 和 UnixMicro。
此外,如果前端传递一个毫秒的时间戳,可以通过 Go1.17 新的函数 UnixMilli 转为 Time 类型:
func UnixMilli(msec int64) Time
注意 UnixMilli 函数和 Time.UnixMilli 方法的区别,互逆的关系。
02 net/url 包
在这个包中有一个类型 Values,定义如下:
type Values map[string][]string
它通常用于查询参数和表单值。它提供了 Set、Get、Del 等方法,但没有提供判断某个 key 是否设置了的方法(虽然自己实现不难,但形式不一致),而且这种需求还挺多的。Go1.17 就增加了一个方法:Has,用来判断某个 key 是否设置了。
// Has checks whether a given key is set.
func (v Values) Has(key string) bool
03 net 包
如何判断一个 IP 地址是否是内网地址?你查找标准库会发现没有这样的方法,这时只能自己实现,需要查找 IPv4 标准,看哪些是内网地址,还得处理 IPv6 的情况。
Go1.17 中增加了一个方法:IsPrivate,用来判断一个 IP 地址是否是内网地址:
// IsPrivate reports whether ip is a private address, according to
// RFC 1918 (IPv4 addresses) and RFC 4193 (IPv6 addresses).
func (ip IP) IsPrivate() bool
是不是方便很多。看它的实现,自己实现可能不那么容易:
func (ip IP) IsPrivate() bool {
if ip4 := ip.To4(); ip4 != nil {
// Following RFC 1918, Section 3. Private Address Space which says:
// The Internet Assigned Numbers Authority (IANA) has reserved the
// following three blocks of the IP address space for private internets:
// 10.0.0.0 - 10.255.255.255 (10/8 prefix)
// 172.16.0.0 - 172.31.255.255 (172.16/12 prefix)
// 192.168.0.0 - 192.168.255.255 (192.168/16 prefix)
return ip4[0] == 10 ||
(ip4[0] == 172 && ip4[1]&0xf0 == 16) ||
(ip4[0] == 192 && ip4[1] == 168)
}
// Following RFC 4193, Section 8. IANA Considerations which says:
// The IANA has assigned the FC00::/7 prefix to "Unique Local Unicast".
return len(ip) == IPv6len && ip[0]&0xfe == 0xfc
}
04 其他包
math 包新提供了 MaxInt、MinInt、MaxUint 三个常量,分别对应 int 的最大、最小值和 uint 的最大值,这样我们不需要自己判断当前 CPU 架构确定最大最小值。
io/fs 包新增加 FileInfoToDirEntry 函数,它用于获取一个 FileInfo 的 DirEntry 信息,在操作文件系统时可能会用到。
func FileInfoToDirEntry(info FileInfo) DirEntry
database/sql 包新增加了 NullByte 和 NullInt16,用于表示可能为 null 的 int16 和 byte 类型(我个人不建议创建数据表时支持 null,这样处理起来比较麻烦,建议全部 NOT NULL)。
05 总结
简单、易用,一直是 Go 的哲学。标准库方面,Go 也会尽可能的做到易用,但不会封装到像 PHP 那样的程度,有些功能,还是需要自己进行二次封装。
你觉得 Go1.17 上面的改进如何?还有哪些功能是你希望标准库提供的?欢迎留言交流。
- 上一篇: 前端项目必备工具值得收藏——格式化时间
- 下一篇: 前端等待接口返回时间过长的解决方案
猜你喜欢
- 2025-07-06 为什么前端大佬都推荐用 performance.now() 而非 Date.now()?
- 2025-07-06 实战分享:邀请有礼产品怎么做?(邀请有礼活动)
- 2025-07-06 揭秘:视频播放网站如何精准记录用户观看进度
- 2025-07-06 第七篇 前端基础十问,看看你是否真的掌握扎实?
- 2025-07-06 下单预约送货时间功能设计及思路(预约送货怎么说)
- 2025-07-06 每天一个 Python 库:datetime 模块全攻略,时间操作太丝滑!
- 2025-07-06 前端代码更新,如何优雅地通知用户刷新页面?
- 2024-10-09 JS Date对象的妙用:如何更优雅的计算时间差?
- 2024-10-09 从零开始的前端请求之旅 从零开始学前端开发
- 2024-10-09 如何在上班时间利用终端控制台摸鱼??????
你 发表评论:
欢迎- 593℃几个Oracle空值处理函数 oracle处理null值的函数
- 586℃Oracle分析函数之Lag和Lead()使用
- 574℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 571℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 567℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 559℃【数据统计分析】详解Oracle分组函数之CUBE
- 546℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 540℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端懒加载 (49)
- 前端获取当前时间 (50)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)