吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1051|回复: 10
收起左侧

[求助] golang gorm框架小疑惑

[复制链接]
doyus 发表于 2021-11-30 11:58
由于理解不深,迁移的时候加& 和不加& 有什么区别?  业务场景是什么?(知道是引用传递和值传递区别)

代码

代码

免费评分

参与人数 1热心值 +1 收起 理由
xunidewangsheng + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

lccasp 发表于 2021-11-30 13:36
这个还是看个人使用吧,反正我一般使用引用引用传递,不然传递之后你得到的值还是原来的没有变化,你看框架的原因都是引用传递
datochan 发表于 2021-11-30 15:52
楼主知道是传值和传引用还问这个问题,我猜应该是对”传引用“这个概念理解不深刻。

我写一下我个人的理解,不论对不对,还望其它看官多指正。

传值没有什么好说的,就是将变量A的内容,复制给到变量B。这样无论对变量B做什么操作,都不会修改到变量A的内容(因为程序是创建了一个变量A的副本给到变量B)。

可是在实际的业务场景中,经常会要求数据只保留一份(不能创建副本),可以在不同的地方对这同一份数据进行修改。如果将这一份数据定义成一个全局变量,管理起来也会比较麻烦。
更可况对于像函数调用这种场景: 函数定义时只能针对形参进行操作,并无法提前知道具体传入的实参是什么,如果直接使用全局变量,代码就不好复用了。

为了解决这个问题,就引入了指针(地址)的概念。可是指针的功能太强大了,可以对指针做任意的地址便宜计算,数据也可以按照调用者的意愿进行篡改(可以跨越函数栈直接修改上层,甚至上上层上下文的环境,最经典的应用就是栈溢出)。

为了对指针进行限制,好多语言就提出了引用的概念。比如LZ提的golang中的引用就已经增加了好多约束,而且golang将对象和对象引用做了好多兼容性的处理,很多场合都会觉得没有区别。
红叶落尽 发表于 2021-11-30 16:28
datochan 发表于 2021-11-30 15:52
楼主知道是传值和传引用还问这个问题,我猜应该是对”传引用“这个概念理解不深刻。

我写一下我个人的理 ...

感谢大佬授课,学习了
zhmyi000 发表于 2021-11-30 17:06
还有一种可能:传地址过去,一般框架的形参是接口类型,然后框架调用接口方法把属性填充到传递的对象中,而不是返回一个对象。因为框架要面向接口,不知道返回什么具体对象。这要看框架如何设计
Jocelyn123 发表于 2021-11-30 18:58
如果是引用类型 在并发的情况下 会不会出现问题噢
xiajin 发表于 2021-11-30 22:18
根据场景使用,改变原值引用,引用更加节省内存,
 楼主| doyus 发表于 2021-12-1 11:09
lccasp 发表于 2021-11-30 13:36
这个还是看个人使用吧,反正我一般使用引用引用传递,不然传递之后你得到的值还是原来的没有变化,你看框架 ...

谢谢回复,产生疑惑的原因是看到有代码 这么写

_ = db.AutoMigrate(&User{}, &Article{}, &Category{}, Profile{}, Comment{})

为什么评论和个人信息那两个模型他选择不取地址传入
 楼主| doyus 发表于 2021-12-1 11:12
datochan 发表于 2021-11-30 15:52
楼主知道是传值和传引用还问这个问题,我猜应该是对”传引用“这个概念理解不深刻。

我写一下我个人的理 ...

谢谢回复,产生疑惑的原因是看到有代码 这么写

_ = db.AutoMigrate(&User{}, &Article{}, &Category{}, Profile{}, Comment{})

为什么评论和个人信息那两个模型他选择不取地址传入

点评

之前回答中有说过的,golang做了兼容处理: 比如LZ提的golang中的引用就已经增加了好多约束,而且golang将对象和对象引用做了好多兼容性的处理,很多场合都会觉得没有区别。 因为golang中是刻意淡化引用传递这个  详情 回复 发表于 2021-12-2 14:51
datochan 发表于 2021-12-2 14:51
doyus 发表于 2021-12-1 11:12
谢谢回复,产生疑惑的原因是看到有代码 这么写

_ = db.AutoMigrate(&User{}, &Article{}, &Category{} ...

之前回答中有说过的,golang做了兼容处理:

比如LZ提的golang中的引用就已经增加了好多约束,而且golang将对象和对象引用做了好多兼容性的处理,很多场合都会觉得没有区别。

因为golang中是刻意淡化引用传递这个概念的(默认除了需要make创建实例的那几个类型,剩下的包括struct在内都是值传递),编码风格上也是推荐值传递,然后将修改后的结果return回来(参考append方法,如果真要传指针都是要在形参上指明的)。


如果LZ去跟踪这个AutoMigrate方法的代码,也会发现它的形参是interface{}并没有特别说明要传指针,而且它仅是对传入参数进行反射解析,并不会修改这些对象的内容,因此传值或者传引用都是可以的。真要在这里说传地址和传值的区别,我能想到的就是传地址比较节省栈空间


如果LZ只是单纯的疑惑于看到代码中部分参数取地址,另一部分参数没有取地址的这种写法,那我猜应该是原作者是不知道AutoMigrate方法怎么用,就网上找了一段代码copy下来修改了修改,结果修改的不完整,忘记加&符号了。


最后,单纯从项目开发的角度,我有几个建议:

1. 表结构一定要单独维护,不要依赖Migrate类的这些方法。

2. 表的约束关系不要通过数据库约束,在程序中通过代码手动控制。

就这样吧~
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 18:43

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表