处理struct的New()错误的最佳实践

时间:2019-07-05 15:37:08

标签: go

给出:

type A struct{}

func New() *A {
  return &A{}
}

处理构建过程中发生的错误的基于最佳实践的建议是什么?

现实情况是根据某些无效的time.Time为特定的time.Location构建location string

编辑:

这不仅仅是“构造函数应该返回错误”。我想讨论替代方法。

例如,如果它不返回错误,则也许我们不允许将值传递到可能导致错误的构造函数中。

我想考虑不同方法的优点。

编辑2:

可能的方法:

  1. 在构造函数中返回错误
  2. 仅返回有效的结构,不允许潜在的无效构造函数参数
  3. 在错误时返回nil结构实例

编辑3:

评分标准

  1. 调用代码行
  2. 自己的代码行
  3. 歧义程度

1 个答案:

答案 0 :(得分:-3)

根据我看到的投票/评论,我将自己回答并结束。如果有人想完善我的答案,请发表评论。

1)在构造函数中返回错误

优点

  • 允许调用代码本身以减少逻辑处理

缺点

  • 由于返回多个参数,因此不允许调用代码进行内联分配。

2)不允许潜在无效的构造函数参数

例如,不接受需要解析为time.Time的字符串日期。相反,需要将time.Time的实例作为参数。

优点

  • 允许调用代码进行内联分配
  • 启用默认设置

缺点

  • 与复合文字相比,使构造函数的功能不方便
  • 可能需要针对该结构的其他单独的便捷方法
  • 需要调用代码来处理更多逻辑

3)允许潜在的无效构造函数参数,并在其位置使用合理的默认值

“将错误推迟到调用更高版本的函数之前”

优点

  • 允许调用代码进行内联分配

缺点

  • 很难知道是否接受了所需的参数

4)错误返回nil结构实例

这是可能的,但这不是一个好主意。甚至有人会说邪恶。

优点

  • 允许内联分配
  • 允许调用代码更加简单/天真

缺点

  • 不是典型的(即惯用的)Go代码
  • 隐藏原因
  • 允许调用代码幼稚