Go 处理struct'New()中错误的最佳实践`

Go 处理struct'New()中错误的最佳实践`,go,Go,鉴于: 键入结构{} func新*A{ 返回&A{} } 对于处理施工期间发生的错误,基于最佳实践的建议是什么 现实世界中的场景是基于某些可能无效的位置字符串为特定的time.Location构建time.time 编辑: 这超出了构造函数func返回错误的范围。我想讨论其他选择 例如,如果它不返回错误,可能我们不允许将可能导致错误的值传递到构造函数中 我想考虑不同方法的优点。 编辑2: 可能的办法: 在构造函数中返回一个错误 仅返回有效的结构,不允许可能无效的构造函数参数 出现错误时返回nil

鉴于:

键入结构{} func新*A{ 返回&A{} } 对于处理施工期间发生的错误,基于最佳实践的建议是什么

现实世界中的场景是基于某些可能无效的位置字符串为特定的time.Location构建time.time

编辑:

这超出了构造函数func返回错误的范围。我想讨论其他选择

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

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

编辑2:

可能的办法:

在构造函数中返回一个错误 仅返回有效的结构,不允许可能无效的构造函数参数 出现错误时返回nil结构实例 编辑3:

评级标准

调用代码行 自己的代码行 歧义程度
根据我看到的投票/评论,我将自己回答并结束。如果有人想完善我的答案,请评论

1在构造函数中返回一个错误 赞成的意见 允许调用代码处理较少的逻辑本身 欺骗 不允许调用代码进行内联赋值,因为它返回多个参数。 2不允许可能无效的构造函数参数 例如,不接受需要解析为time.time的字符串日期。相反,需要一个time.time实例作为参数

赞成的意见 允许调用代码进行内联赋值 启用正常默认值 欺骗 使构造函数func比复合文字更不方便 可能需要对结构使用其他单独的方便方法 需要调用代码来处理更多逻辑 3允许可能无效的构造函数参数,并在其位置使用正常默认值 延迟错误,直到调用后面的函数

赞成的意见 允许调用代码进行内联赋值 欺骗 很难知道所需参数是否被接受 4在出现错误时返回nil结构实例 这是可能的,但不是一个好主意。有些人甚至会说邪恶

赞成的意见 允许内联分配 允许调用代码更简单/简单 欺骗 不典型,即Go代码的惯用用法 隐藏原因 允许调用简单的代码
返回*A,函数出错。可能重复@Ceriselimon I编辑我的问题以澄清。我想考虑基于现实世界的经验选择。返回一个错误是一种选择,但它可能会使调用代码复杂化。2是不清楚的-我不确定您如何不允许可能无效的构造函数参数。三是单向走;“1是表示发生错误的正确方式,它实际上会让打电话的人知道错误是什么,而不仅仅是出了什么问题。”@Adrian看到我下面的答案了吗?我认为我们对1的讨论是唯一有意义的。2只是类型安全,不需要建造师。3是纯粹的邪恶。4几乎总是邪恶的。可能只有当nil值本身有意义时,它才有意义。但它变成了3,所以仍然是邪恶的。实际上,我认为你有3个选择:1返回一个错误。2进行重构,以避免出现错误。3如果适用,请将错误推迟到调用以后的函数。我同意4是最不理想的。我将在3号编辑我的答案,并附上你的澄清。