一段時間以來,我一直在嘗試創建一個驗證型別變數的函式[][2]time.Time。陣列的列分別表示一對time.Time輸入日期和出站日期。但我無法生成解決所有可能無效組合的代碼,同時不會使實際有效的組合無效。無效的規則是:
日期不能長于當前日期和時間。
時間不可能相同。例如:
[][2]time.Time{{time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC)}}。或者[][2]time.Time{ {time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 9, 0, 0, 0, time.UTC)}, {time.Date(2020, 11, 23, 9, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 11, 0, 0, 0, time.UTC)}}如果之前沒有輸出,則不能有新條目。例如:
[][2]time.Time{ {time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC), time.Time{}//Default}, {time.Date(2020, 11, 23, 10, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 11, 0, 0, 0, time.UTC)} }日期必須按升序排列,即在這種情況下表示條目的第一個切片日期必須早于第二個,第二個比第三個早,依此類推。因此,以下是無效組合的示例:
[][2]time.Time{ {time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 7, 0, 0, 0, time.UTC)}, {time.Date(2020, 11, 23, 10, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 11, 0, 0, 0, time.UTC)} }.
給我帶來最大問題的是默認值,因為它們是有效的 Time 物件,但它們應該被視為 null,即沒有報告輸出日期。想象一下,如果它是一個工人的積分表,如果有一個進入日期但輸出是默認的意味著工人進入但還沒有離開,即這是一個有效的情況。但是,如果之前的條目還沒有輸出,那么工人注冊新條目是無效的。到目前為止,這就是我能夠生成的代碼。是的,它不完整,因為我已經修改了很多次,我不知道如何繼續前進。
func validSliceArrayTime(slarti [][2]time.Time) bool {
now_time := time.Now()
var rtime, ltime time.Time
var rt_is_def bool
for _, v := slarti {
rtime = v[1]
rt_is_def = rtime.Year() <= 1
switch {
case v[0].Year() <= 1:
return false
case v[0].After(now_time):
return false
case (!v[0].Before(rtime) && !rt_is_def):
return false
case !v[0].After(ltime):
return false
// case !rtime.After(ltime):
// return false
// case rtime.After(now_time):
// return false
default:
ltime = v[1]
}
}
return true
}
uj5u.com熱心網友回復:
要檢查 atime.Time是否為零值,請使用Time.IsZero().
除此之外,只需逐一實施您的規則。它不會是最有效的解決方案,但它會干凈簡單,一旦它正常作業,您就可以改進它:
func isValid(slarti [][2]time.Time) bool {
now := time.Now()
for i, v := range slarti {
v1, v2 := v[0], v[1]
// Rule #3
if v1.IsZero() {
return false
}
// Rule #1: times must be in the past
if now.Before(v1) || now.Before(v2) {
return false
}
// Rule #2: times can't be the same
if v1.Equal(v2) {
return false
}
if i > 0 && v1.Equal(slarti[i-1][1]) {
return false
}
// Rule #3: invalid entry if no output before:
if i > 0 && slarti[i-1][1].IsZero() {
return false
}
// Rule #4: times must be in ascending order:
if !v2.IsZero() && v2.Before(v1) {
return false
}
if i > 0 && v1.Before(slarti[i-1][1]) {
return false
}
}
return true // Got this far: valid
}
這是一個測驗所有規則以及有效輸入的測驗代碼(在Go Playground上試試):
cases := []struct {
name string
input [][2]time.Time
valid bool
}{
{
name: "Valid",
input: [][2]time.Time{{time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 9, 0, 0, 0, time.UTC)}},
valid: true,
},
{
name: "Valid (2)",
input: [][2]time.Time{{time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 9, 0, 0, 0, time.UTC)}, {time.Date(2020, 11, 23, 10, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 11, 0, 0, 0, time.UTC)}},
valid: true,
},
{
name: "Valid (3)",
input: [][2]time.Time{{time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 9, 0, 0, 0, time.UTC)}, {time.Date(2020, 11, 23, 10, 0, 0, 0, time.UTC), time.Time{}}},
valid: true,
},
{
name: "Rule #1",
input: [][2]time.Time{{time.Date(2023, 11, 23, 8, 0, 0, 0, time.UTC), time.Date(2023, 11, 23, 9, 0, 0, 0, time.UTC)}},
},
{
name: "Rule #2",
input: [][2]time.Time{{time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC)}},
},
{
name: "Rule #2 (2)",
input: [][2]time.Time{{time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 9, 0, 0, 0, time.UTC)}, {time.Date(2020, 11, 23, 9, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 11, 0, 0, 0, time.UTC)}},
},
{
name: "Rule #3",
input: [][2]time.Time{{time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC), time.Time{}}, {time.Date(2020, 11, 23, 10, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 11, 0, 0, 0, time.UTC)}},
},
{
name: "Rule #3 (2)",
input: [][2]time.Time{{time.Time{}, time.Date(2020, 11, 23, 9, 0, 0, 0, time.UTC)}, {time.Date(2020, 11, 23, 10, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 11, 0, 0, 0, time.UTC)}},
},
{
name: "Rule #4",
input: [][2]time.Time{{time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 7, 0, 0, 0, time.UTC)}, {time.Date(2020, 11, 23, 10, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 11, 0, 0, 0, time.UTC)}},
},
}
for i, c := range cases {
if valid := isValid(c.input); valid != c.valid {
log.Printf("[%d] %q expected valid: %t, got: %t", i, c.name, c.valid, valid)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/508651.html
標籤:去时间片
