gpt4 book ai didi

oop - 在Golang中用一个struct,把它当成一个类来解决依赖不好吗?

转载 作者:数据小太阳 更新时间:2023-10-29 03:05:40 26 4
gpt4 key购买 nike

之前用OOP框架写了很多PHP,正在学习Golang,

当我使用 PHP 时,class很有用,我可以通过 $model进入我的类(class)然后在函数之间共享它:

class User {
function __construct(UserModel $model) {
$this->model = $model
}

function delete($id) {
$this->model->delete($id);
}

function update($id) {
$this->model->update($id);
}
}

$UserModel = new UserModel();
$User = new User($UserModel);
$User->delete(1);

但是没有 class在 Golang 中,我知道我可以像对待类一样对待结构:

type User struct {
model *models.User
}

func (u *User) Delete(id int) {
u.model.Delete(id)
}

func (u *User) Update(id int) {
u.model.Update(id)
}

userModel := &models.User{}
user := User{model: userModel}
user.Delete(1)

我感觉像 struct 用于存储信息struct的方法应该用来修改struct的值

但是现在我做了一个结构体只是因为我想像类一样对待它并且解决依赖性问题,在Golang中使用这样的方法不好吗?

最佳答案

从整体概念的角度来看,您的实现没有任何问题。

在详细 View 中存在引起问题的不一致。

在以下所有情况下,由于在各种 Delete 调用之间共享数据,因此存在潜在的并发问题。

案例A

如果 models.User{} 完成所有工作,那我们为什么不能

userModel := &models.User{}
userModel.Delete(userId)

案例B

如果 User 是我们的公共(public)接口(interface):

user      := User{model: userModel}
user.Delete(1)

然后将 userId 删除是多余的,应按如下方式进行:

user.Delete()

userId 取自用户上下文。

案例C

否则,我们可能希望为所有 User 实例设置 userModel:

package User;
// private package level variable
var model = userModel
func Delete(userId int) {
model.Delete(userId)
}
...
User.Delete(userId)

结论

以上每个案例都解决了相同的问题,只是侧重点略有不同。案例 A 很简单。案例 B 和 C 依赖于可以与事件通知一起使用的底层共享代码。案例 B 和 C 在用户范围上是不同的。在案例 B 中,用户是一个结构。在案例 C 中,用户是一个包名。我认为案例 C 的使用频率低于案例 B。因此,如果坚持使用底层模型,那么从用户代码的角度来看,案例 B 可能是最直观的解决方案。

关于oop - 在Golang中用一个struct,把它当成一个类来解决依赖不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40207528/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com