假设我们想要创建一个自定义Probability类型来表示 0 到 1 之间的数字。我们可以这样做:
type Probability float64
func NewProbability(p float64) (*Probability, error) {
if p < 0 || p > 1 {
return nil, errors.New("Invalid Probability")
}
tmp := Probability(p)
return &tmp, nil
}
只要我们的代码的客户端始终使用我们的NewProbability构造函数,这种方法就有效。但他们可以通过类型转换来绕过它:
func main() {
// works as intended
p1, _ := NewProbability(0.5)
fmt.Println(*p1)
// errors as intended
_, err := NewProbability(2)
fmt.Println(err)
// circumvents our constraints...
// creates invalid Probability
p3 := Probability(2)
fmt.Println(p3)
}
https://play.golang.org/p/xJZQhkZLi_H
2个问题:
有没有什么方法可以防止这种规避,这样即使有的话Probability它也总是有效的?
与主要问题无关:如果我tmp在构造函数中省略变量而是这样做return &Probability(p), nil,则会收到错误cannot take the address of Probability(p)(尝试一下)。为什么使用变量时tmp不会出现此错误?
MMTTMM
湖上湖
慕桂英546537
相关分类