我需要保存[]或具有不同整数值的列表,例如[1,7,8]。这些值可以是1-31之间的任何值。
我对此字段(DateOfMonth)的结构是:
type Subscription struct {
gorm.Model
Enabled bool `gorm:"DEFAULT:True"`
Deleted bool `gorm:"DEFAULT:False"`
UserID uint `gorm:"not null"`
Cap int `gorm:"DEFAULT:-1"`
DateOfMonth []int64 `gorm:"type:json default '[]'::json"`
}
现在,我需要在API中读取此值,并将其与current_date进行比较。为此,我尝试了:
type Result struct {
ID uint
Email string
UniqueIdentifier string
Cap int
DateOfMonth []uint8
}
var subscriptions []Result
if err := db.Table("users").Select("users.id, users.email, users.unique_identifier, subscriptions.cap, subscriptions.date_of_month").Joins("join subscriptions on users.id = subscriptions.user_id").Where("subscriptions.subscription_type_id=? and users.is_verified=? and subscriptions.enabled=?", subscription_type_id, true, true).Find(&subscriptions).Error; err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": true, "reason": "Subscribers not found!", "code": http.StatusBadRequest, "status": "failure"})
return
}
如果我将DateOfMonth []uint8
更改为DateOfMonth []int64
,则会出现错误。我在此字段中收到的值是字节值列表
例如,[]-> [91 93]和[6]-> [91 54 93]
如果我这样做,
bytes.NewBuffer(s.DateOfMonth)
,我得到了正确的值,但是我需要遍历该 slice 以将其与今天的日期进行比较。我尝试了很多方法来在循环(dom值)中获取实际值(6),但无济于事。// if len(s.DateOfMonth) > 0 {
// // date_of_month_new := binary.BigEndian.Uint64(date_of_month)
// todays_date_of_month := time.Now().Day()
// fmt.Println(todays_date_of_month) //, date_of_month, reflect.TypeOf(date_of_month))
// for _, dom := range s.DateOfMonth {
// fmt.Println("help", reflect.TypeOf(dom), dom, todays_date_of_month)
// // if dom == todays_date_of_month {
// // fmt.Println("matching", dom, todays_date_of_month)
// // }
// }
// }
我什至尝试了各种答案的建议,例如this,this,this我在这里想念什么?非常感谢您的帮助。
我遇到的一些错误:
invalid sql type DateOfMonth (slice) for postgres
Golang cannot range over pointer to slice
cannot range over bytes.NewBuffer(s.DateOfMonth) (type *bytes.Buffer)
sql: Scan error on column index 4, name "date_of_month": unsupported Scan, storing driver.Value type []uint8 into type *[]int
最佳答案
Golang cannot range over pointer to slice
您正在遍历指向 slice 而不是 slice 的指针。这意味着您将必须首先取消引用变量,然后对其进行循环。签出this example。
cannot range over bytes.NewBuffer(s.DateOfMonth) (type *bytes.Buffer)
您不能超出
*bytes.Buffer
类型。您可以使用Buffer.Bytes()
方法访问该类型的字节。签出this example。sql: Scan error on column index 4, name "date_of_month": unsupported Scan, storing driver.Value type []uint8 into type *[]int
从错误的角度来看,我猜这是在您扫描
[]int64
时使用DateOfMonth
类型时发生的。发生此错误的可能性之一是您的数据库将值存储为[]uint8
而不是[]int64
。Postgres的无效SQL类型DateOfMonth( slice )
在能够成功重现此错误之后,我将尝试更新我的答案。