热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

golang泛型_Golang之于DevOps开发的利与弊(六部曲之四):time包和方法重载

万众期待的Golang之于DevOps开发的利与弊系列终于回归了!在这篇文章,我们讨论下Golang中的time包,以及go语言中为什么不
1975f8508b31618a72579bdce69e417b.png

万众期待的 Golang 之于 DevOps 开发的利与弊 系列终于回归了!在这篇文章,我们讨论下 Golang 中的 time 包,以及 go 语言中为什么不使用方法重载。

如果你没有读 最近一篇 关于 “接口实现和公有/私有命名方式”(原文描述写错了,这一链接对应的应该是 “速度 vs. 缺少泛型”),请一定仔细阅读下,你也可以 订阅我们的博客更新,以后有系列文章发布的时候你就能收到通知。

  • Golang 之于 DevOps 开发的利与弊(六部曲之一):Goroutines, Channels, Panics, 和 Errors
  • Golang 之于 DevOps 开发的利与弊(六部曲之二):接口实现的自动化和公有/私有实现
  • Golang 之于 DevOps 开发的利与弊(六部曲之三):速度 vs. 缺少泛型
  • Golang 之于 DevOps 开发的利与弊(六部曲之四):time 包和方法重载
  • Golang 之于 DevOps 开发的利与弊(六部曲之五):跨平台编译,Windows,Signals,Docs 以及编译器
  • Golang 之于 DevOps 开发的利与弊(六部曲之六):Defer 指令和包依赖性的版本控制

Golang 之利: Time 包的使用

编程的人都知道处理 date 和 time 时候的危险。时间(time)在我们每天的生活中看似平常,可从计算机的角度看,time 处理简直是噩梦。Google 有了这个机会使处理 date 变得轻松点,他们成功了!我将 time 包 的讲解分成了三部分:(1)基本内容,(2)timer 定时器,(3)date 解析。

1. Time 包基本内容

你可能认为每一种语言都有一个标准的,易用的处理 time 操作的内置库,其实不是这样的。NPM 有超过 8000 多个 time 相关的包,因为 Javascript 的 Date 包没法用。Java8 最终使用 java.time.Instant 和 java.time.chrono 包缓解了这个问题,但仍在编写 教程,研究各种用 Java 操作 time 的类和方法。相反,Golang 的 time 包 用一句话就能总结:只需引用一个包,你想要的都能实现。

获取当前时间: time.Now()

获取将来某个时刻: time.Now().Add(5*time.Minute)

获取经过多少时间(持续时间):time.Since(processingStarted)

轻松地比较持续时间: if frequency

获取当月日期,放弃 calendar 吧! time.Now().Day() 就够了

2. Timers 定时器

这个 time 包另一个大的加分项是使用 timer 定时器很方便。DevOps 的应用很明确:我们经常需要安排一些任务在将来执行,一些重复的基本操作,或者就是 sleep 一会。

用 time 包里的 co-locating 定时器,你可以轻松实现 sleep 一个线程,如

time.Sleep(2*time.Minute)

或者在将来的某个时刻执行一个函数

time.AfterFunc(5*time.Second, func() {fmt.Println("hello in the future")
})

或者重复执行一个任务

tick := time.NewTicker(1*time.Minute)
select {
case <- tick.C:foo()
}

&#xff08;这些操作&#xff09;都不需要将时间转换成 second&#xff08;还是 millsecond 来着&#xff1f;&#xff09;&#xff0c;&#xff08;也不用&#xff09;添加 2 个依赖库&#xff0c;&#xff08;也不用&#xff09;引入 10 个包。

3. Date 解析

不说下我们最常见又最讨厌的话题&#xff1a;将字符串转成 date &#xff0c;那关于 time 的讨论就是不完整的。这本该是个初级问题&#xff0c;却一点也不简单。date 格式有 诸多标准&#xff0c;编程语言内部并没有一个线程安全的实现 来解析 date 和 timezone&#xff0c;就是为了确保不是所有的地方&#xff08;同一时刻&#xff09;都是 5 点钟。这就是 Golang 意识到的重要的地方&#xff1a;其他人做的都是错的。

Google 没有生成解决方案去处理成千上万的 date 格式&#xff0c;而是创建了一套系统&#xff0c;使用基于 pattern 的设计&#xff0c;永远参考同一个参照时间&#xff1a; Mon Jan 02 15:04:05 MST 2006 。组成这个单一参照时间的元素&#xff0c;可以重新组合成任何一种你可能遇到的格式。你可以在这里&#xff08;原文没有链接&#xff0c;疑似 这里&#xff09;找到准确&#xff0c;完整的说明。

当然&#xff0c;Golang 的 date 解析也不那么完美&#xff0c;是吧&#xff1f;嗯&#xff0c;当然。你至少要考虑一个问题&#xff1a;timezone &#xff0c;否则不能重新解析 date。除此之外&#xff0c;安排会议也大不可能了&#xff0c;还是因为 Golang 里的 timezone&#xff0c;让类似 “2017/10/03 4:07:22 America/New_York” 这样的解析比较困难。“America/New_York” 这几个 bit &#xff08;解析起来&#xff09;比较麻烦。有一些 变通的解决办法&#xff0c;不过 Golang 在解析 timezone 这部分还需要改进。

Golang 之弊: 函数重载

我想起上计算机科学课时候的事&#xff0c;第一感觉就是“太酷了&#xff01;”&#xff0c;但是在 Golang 里完全不存在这种“酷”。以下来自 Golang FAQ&#xff1a;

为什么 Go 不支持方法和操作符重载&#xff1f; 如果不用做类型匹配&#xff0c;方法调度过程也会简化。使用其他语言的经验告诉我们&#xff0c;一些有着同名但不同签名的函数有时候很有用&#xff0c;不过实际使用中也会造成误解&#xff0c;不够健壮。 Go 类型系统主要使用的简化决策是只通过函数名匹配&#xff0c;并且要求类型的一致性。就操作符的重载来说&#xff0c;似乎比绝对要求&#xff08;类型一致性&#xff09;方便。 不过还是&#xff0c;没有重载会更简单。 当然&#xff0c;没有方法重载确实更简单。但这样也会强制你想出唯一的函数名以防出现同名函数&#xff0c;这样一来就增大了你的代码量。如果你只是想复制粘贴下代码&#xff0c;“以后再解”&#xff0c;还要记住共用函数是在私有的还是公共函数起作用。后面提到的 time 包有几个这样的实例&#xff0c;我们特别想用一个默认值替代最后那个可选参数。

func Parse(layout, value string) (Time, error) {return parse(layout, value, UTC, Local)
}
func ParseInLocation(layout, value string, loc *Location) (Time, error) {return parse(layout, value, loc, loc)
}
func parse(layout, value string, defaultLocation, local *Location) (Time, error) {...
}

[源代码地址]

这就是说&#xff0c;没有方法重载绝不妨碍使用 Golang。在几个我想用&#xff08;重载&#xff09;的实例中&#xff0c;我最终只用了一个共用的私有函数&#xff0c;和其它几个不同名字的函数&#xff0c;或是删除了我一开始说需要重载的原因。

每隔一周左右&#xff0c;我们会发布一篇新指南&#xff0c;和本篇一样都在 “Golang 之于 DevOps 开发的利与弊” 六部曲中。下一篇&#xff1a;#5&#xff1a;跨平台编译&#xff0c; Windows &#xff0c; Signals &#xff0c;Docs 和编译器。

现在起 订阅我们的博客吧&#xff0c;这样你就不会错过我们的文章发布了&#xff0c;如果你觉得你的开发者朋友们能受益于了解 Golang 的利与弊&#xff0c;请把这篇博文分享给他们&#xff0c;尤其是有关 DevOps 生命周期的。感谢您阅读和分享。





推荐阅读
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有