【发布时间】:2017-05-16 10:46:17
【问题描述】:
我之前用OOP框架写了很多PHP,正在学习Golang,
当我使用 PHP 时,class 很有用,我可以将$model 传递给我的类,然后在函数之间共享它:
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);
但是在 Golang 中没有 class,我知道我可以将结构视为一个类:
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是用来存储信息的,结构体的方法应该用来修改结构体的值。
但是现在我做了一个结构,只是因为我想把它当作一个类并解决依赖问题,在 Golang 中使用这种方法是不是很糟糕?
【问题讨论】:
-
我不确定你到底在问什么,但我看不出你在做什么有什么问题(除了将
int传递给这些函数而不是id–它不会按原样编译)。 -
糟糕,感谢您的纠正,就像我说的,我来自 OOP 背景,但我不确定是否应该将我的“旧想法”带到新语言中,因为我听说很多关于“不要在 Golang 中使用 OOP”,这就是为什么我不确定我这样做是对还是错。
-
我认为反对在 Go 中使用 OOP 的警告是愚蠢的。显然,Go 不是典型的 C++ 或 Java 模型中的面向对象语言,但它确实具有允许您在开发软件时使用 OO 原则的特性。正如你所说,Go 没有传统的类,但它有结构、接口、带有接收器的方法和嵌入,所有这些都允许你做类似于你在 OO 语言中可以做的事情。一些值得注意的例外是没有构造函数和析构函数,并且没有直接等效的子类化(尽管嵌入是相似的)。
-
我也不清楚你在问什么所以一些随机的想法:依赖注入是要走的路;您当然可以将结构定义视为一个类,并将该结构的实例视为对象;你可能想要一个
func NewUser(m *models.User) User { ... } -
@Plato 我之前考虑过使用
func NewUser(m *models.User) User { ... },但我必须在我的函数周围传递models.User,另外,如果我想为函数添加新参数,它并不灵活。
标签: oop go struct dependency-injection dependencies