亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在結構中表示可選 time.Time 的慣用方式

在結構中表示可選 time.Time 的慣用方式

Go
慕慕森 2023-03-29 17:23:40
我已經閱讀了兩個可選參數?和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 實現我想要做的事情的慣用方式是什么?
查看完整描述

1 回答

?
撒科打諢

TA貢獻1934條經驗 獲得超2個贊

time.Time是一個結構。它的零值——盡管是一個有效的時間值——就像從未使用過一樣。您可以利用零值時間來指示丟失或未定義的時間值。甚至有一種Time.IsZero()方法可以告訴您某個time.Time值是否為零值。

請注意,零值時間不是某些其他語言中的 1970 年 1 月 1 日,而是 1 年 1 月 1 日,正如您在 Go?Playground上看到的那樣。這也記錄在time.Time

Time 類型的零值為 1 年 1 月 1 日 00:00:00.000000000 UTC。由于這個時間在實踐中不太可能出現,IsZero 方法提供了一種簡單的方法來檢測未明確初始化的時間。

此外,在創建Periodical值時,使用 keyed?composite literal,您可以省略不想設置的字段,從而將它們保留為零值:

eachYear?:=?Periodical{
????Interval:?interval.Years(1),
????StartsAt:?time.Date(1970,?1,?1,?0,?0,?0,?0,?time.UTC),
}

請注意,您不能time.Parse()在此復合文字中使用,因為它會返回 2 個值(atime.Time和 an?error)。time.Date()要么像上面的例子一樣使用,要么先創建時間值(處理錯誤),然后只使用時間值。

判斷是否EndsAt指定:

if?eachYear.EndsAt.IsZero()?{
????fmt.Println("EndsAt?is?missing")
}

如果您需要將已設置(非零)的時間值歸零,您可以使用time.Time{}復合文字:

eachYear.StartsAt?=?time.Time{}

另請注意,當編組一個time.Time值時,即使它是零值(因為它是一個有效的時間值),即使您使用該選項,它也會被發送omitempty。在這些情況下,您必須使用*time.Time指針或編寫自定義編組器。

查看完整回答
反對 回復 2023-03-29
  • 1 回答
  • 0 關注
  • 119 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號