Go Slice踩坑

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中存了底层数组的指针,复制不会发生变化。传递进去后发现没有结果。

造成这种情况的原因是当切片发生扩容时,地址数组指向原数组的不会变,但是会添加新的数组指针。

来啊,造作啊
原文地址:https://www.cnblogs.com/linga/p/14304184.html