3 回答
TA贡献1869条经验 获得超4个赞
您可以防止创建无效的自定义类型吗?
不。
“经典”OOP 语言所提倡的“如果防止误用就不会出现问题”的想法是没有根据的。如果用户不阅读您的文档就会出现问题。
TA贡献2003条经验 获得超2个赞
1)您可以尝试将 Probability 设为一个包含隐藏浮点值的结构,但您将无法将其用作数字。另一种选择是将 IsValid() 方法添加到 Probability(有点类似于 NaN)。
2) Probability(p) 是 p 的副本,类型为 Probability。它是一个运算结果的值,在分配给变量之前没有地址。当您将其分配给变量时,您可以获得该变量的地址。
TA贡献1848条经验 获得超10个赞
这个问题每隔一段时间就会出现一次。“确保”不会将无效值分配给某些自定义类型的唯一方法是在未导出的结构体字段中使用 getter 和 setter 来保护它:
type Probability struct {
p float64
}
func NewProbability(p float64) (Probability, error) {
if p < 0 || p > 1 {
return Probability{}, errors.New("invalid probability")
}
return Probability{p}
}
对于像浮动这样简单的东西来说,这可能有点过分了。更明智的方法通常是检查每当您接受这样的参数时是否收到有效的概率:
func DidItHappen(p probability) (bool, error) {
if p < 0 || p > 1 {
return false, errors.New("invalid probability")
}
if /* roll the dice */ {
return true, nil
}
return false, nil
}
- 3 回答
- 0 关注
- 114 浏览
添加回答
举报