Go Slice踩坑
Go中的slice内部是实现的如下:
type slice struct {
array unsafe.Pointer // 底层数组指针
len int // 使用的长度
cap int // slice 容量
}
踩坑代码如下:
操作数据库代码:
func (m *monitorRepository) GetAllMonitoringURL(db *gorm.DB, urlM []model.URLMonitor) (err error) {
err = db.Where("is_delete = ?", 0).Find(&urlM).Error
return
读取数据内容
func ReadUsingSchedule() {
urls := []model.URLMonitor{}
repositories.MonitorRepository.GetAllMonitoringURL(databases.DB(), urls)
fmt.Println(urls)
}
结果为空[]
当向GetAllMonitoringURL传递切片时,由于Go全部是值传递,但是urls中存了底层数组的指针,复制不会发生变化。传递进去后发现没有结果。
造成这种情况的原因是当切片发生扩容时,地址数组指向原数组的不会变,但是会添加新的数组指针。