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

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

posted @   咕咚!  阅读(87)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示