我已经阅读了两个可选参数?和Golang 将 nil 作为可选参数传递给函数?
仍然想知道我的情况是否更具体。
我得到的是:
type Periodical struct {
Interval *interval.Interval
StartsAt time.Time
EndsAt time.Time
}
表示具有开始日期且可能有也可能没有结束日期的周期性事件(周期性事件运行的时间不确定)。
eachYear := Periodical{
interval.Years(1),
StartsAt: time.Parse("2 Jan 2006", "1 Jan 1970")}
会扔
periodical/periodical.go:31:39: cannot use nil as type time.Time in field value
据了解,-我没有指定EndsAt time.Time。
但是我在那儿真正做什么呢?
我是否被迫有一个特殊的标志来忽略EndsAt这样的事情?
type Periodical struct {
Interval *interval.Interval
StartsAt time.Time
EndsAt time.Time
isIndefinite bool // This looks ugly already
}
然后如果我想要Yearly/Anually我会做类似的事情
eachYear := Periodical{
interval.Years(1),
time.Parse("2 Jan 2006", "1 Jan 1970"),
time.Parse("2 Jan 2006", "1 Jan 1970"),
isIndefinite: true}
虽然,我可以在业务逻辑中考虑这个标志,但是这个EndsAt设置为相同(或任何其他)日期看起来有点乏味。
我还在 package 上定义了一个方法periodical,它允许像这样有一个简写的定期事件:
func Monthly(s, e time.Time) Periodical {
return Periodical{StartsAt: s, EndsAt: e, Interval: interval.Months(1)}
}
我该怎么做才能省略end(第二个参数)?我是被迫为此使用单独的方法还是做一些看起来有点时髦且缺乏可读性的事情:
func Monthly(s time.Time, end ...time.Time) Periodical {
if len(end) == 1 {
return Periodical{
StartsAt: s,
EndsAt: end[0],
Interval: interval.Months(1),
isIndefinite: false}
} else if len(end) > 1 {
panic("Multiple end dates are not allowed, don't know what to do with those")
} else {
return Periodical{
StartsAt: s,
EndsAt: time.Now(),
Interval: interval.Months(1),
isIndefinite: true}
}
}
虽然它可以解决问题,但它看起来很难看,不是吗?我简洁的一行代码现在分散在几行代码中。
所以,这就是为什么我想知道,go 实现我想要做的事情的惯用方式是什么?
撒科打诨
相关分类