golang两种代码方式的优缺点?

Loveyou
  • 37

请问下大家,以下两种代码,哪一种更合适,分别有什么优缺点?
个人觉得第一种代码量多 而且有一个空的结构体 意义呢?
哪一种使用的更广泛一些?

个人觉得 第一种方式类似有点像c#的味道 NewUserLogic 类似于构造方法 返回的是实例化后的对象 之后通过对象去访问对象的方法!!!

第二种类似于js的函数式编程 一个函数调用另一个函数

所以有点懵逼 到底哪种合适 哪种好一点!!!

第一种: 使用结构体

type UserLogic struct {}

type ProductLogic struct {}

func NewUserLogic ()*UserLogic {
    return New(UserLogic)
}

func NewProductLogic () *ProductLogic{
    return New(ProductLogic)
}

func (*UserLgic ) GetUserById(id int64) (model.User,error) {
    // 逻辑代码
}

func (*ProductLogic) GetProductById(id int64) (model.Product,error) {
// 逻辑代码
}

// 调用
user,err :=logic.NewUserLogic().GetUserById(1)
product,err :=logic.NewProductLogic().GetProductById(1)

第二种 直接定义直接调用

func GetUserById(id int64) (model.User,error) {
    // 逻辑代码
}

func GetProductById(id int64) (model.Product,error) {
// 逻辑代码
}

// 调用
user,err :=logic.GetUserById(1)
product,err :=logic.GetProductById(1)
回复
阅读 2.7k
3 个回答

第一种方法中的结构体更多的是起到命名空间的作用。代码量小的时候当然是第二种方法更简单。如果代码量很多,这种全局的函数很容易产生命名冲突。而且go语言中,第一种方法GetUserById和GetProductById一般将User和Product省略。因为UserLogic本身就表示对User的操作了,除了是例外的情况。并且Get方法中的Get一般也是省略的,所以方法名可以简化为ById

1、首先从概念上说,上面的属于【方法】,下面的属于【函数】(参考

2、从使用上,针对你提出的场景,用上面的更好些,业务逻辑划分更清楚

3、其实可以写的更优雅一些,就是进一步抽象出接口

eg.


type model struct{}

type Logic interface {
    GetById(int64) (model, error)
}

type defaultUserLogic struct {}

type defaultProductLogic struct {}

func NewUserLogic ()Logic {
    return &defaultUserLogic{}
}

func NewProductLogic () Logic{
    return &defaultProductLogic{}
}

func (u *defaultUserLogic ) GetById(id int64) (model,error) {
    // 逻辑代码
    return model{}, nil
}

func (p *defaultProductLogic) GetById(id int64) (model,error) {
    // 逻辑代码
    return model{}, nil
}

// 调用
user,err :=logic.NewUserLogic().GetById(1)
product,err :=logic.NewProductLogic().GetById(1)

这样写的最大好处在于后续可以很方便的写单测,其他调用的地方,只需要对接口进行mock就可以测试,充分解耦且便于扩展
同时,接口也会在一定程度上规范下面实现的统一性

大项目,业务分层,拆包供其他包调用时,用第一种;
包内时,用第二种;

更多可参考 Uber Go 风格指南(译)

宣传栏