为啥 time.Parse 返回 error, func (t Time) Format(layout string) string 不返回 error 呢?

2019-03-05 15:01:34 +08:00
 sunjourney

这个 API 为什么设计成这样?

1805 次点击
所在节点    Go 编程语言
12 条回复
jingxyy
2019-03-05 15:16:02 +08:00
因为确实不会有 error,layout 参数里就是什么都可以传……
GTim
2019-03-05 17:41:50 +08:00
time.Parse 有 error 是因为参数只有那么几种,你多给了就会报错

Format 不会报错也是参数就那么几种,没有就忽略不处理即可
reus
2019-03-06 16:27:34 +08:00
和 strconv.Itoa 没有 error 而 strconv.Atoi 有 error 一个道理吧
sunjourney
2019-03-06 20:22:11 +08:00
@jingxyy @GTim layout 可以自己传 layout 啊,如果 layout 不对就返回原值,问题就出在这个原值上,它应该是个 error。
GTim
2019-03-06 20:28:02 +08:00
@sunjourney 时间对象的原值是? nil ?
sunjourney
2019-03-06 20:34:30 +08:00
@GTim #5 struct
GTim
2019-03-06 20:48:29 +08:00
@sunjourney 解析出错就没有原值啊,原值要么 nil 要么是 1970-01-01 00:00:00,后者肯定不合适,前值就是现在返回的,只不过多返回了为啊解析出错而已
sunjourney
2019-03-06 20:54:38 +08:00
@GTim #7 返回原来的字符串
sunjourney
2019-03-06 20:59:24 +08:00
再想想好像也合理...
GTim
2019-03-06 21:13:58 +08:00
@sunjourney 返回原来的字符串就破坏了返回值类型了。一个是 Time 结构,一个是 string 类型

在强类型语言里,这是不符合约定的。

只有弱类型的语言,才可以这么随心所欲

不过,真要是返回 String,在若类型语言里,也会被同事打的
jingxyy
2019-03-07 10:01:50 +08:00
@sunjourney
“如果 layout 不对就返回原值”这句是有问题的,按照这个接口设计的含义 layout 只要是个字符串,就不可能“不对”,而且也不是返回原值,这里的 format 函数要理解为一个能够格式化时间对象的通用字符串格式化函数(想象一下 c 里面的 printf ),而不是一个把时间对象进行格式化的函数。
当然,作为 Time 的成员函数这么设计我觉得确实是有一点 confusing 的。
sunjourney
2019-03-07 17:49:27 +08:00
@jingxyy #11 还有就是这两组也不是互逆的,Time.Format + layout 得到的 string,喂给 time.Parse + 同一个 layout,不一定就是时间

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/541333

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX