Go 能否防止创建无效的自定义类型?

Go 能否防止创建无效的自定义类型?,go,Go,假设我们要创建一个自定义的概率类型来表示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 &

假设我们要创建一个自定义的
概率
类型来表示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
}

2个问题:

  • 是否有任何方法可以防止这种规避,这样,如果你有
    概率
    ,它总是有效的
  • 与主要问题无关:如果我在构造函数中省略
    tmp
    变量,而是执行
    return&Probability(p),nil
    ,那么我得到的错误
    不能取概率(p)的地址。
    ()。为什么在使用
    tmp
    变量时会出现此错误
  • 1) 您可以尝试将概率设置为包含隐藏浮点值的结构,但不能将其用作数字。另一种选择是将IsValid()方法添加到概率中(有点类似于NaN)

    2) 概率(p)是p的一个副本,类型为概率。它是一个操作的结果值,在分配给变量之前没有地址。将其分配给变量时,可以获得该变量的地址

    能否防止创建无效的自定义类型

    没有


    而“经典”OOP语言所提倡的如果防止误用就不会出现问题的想法是没有道理的。如果用户不阅读您的文档,就会出现问题

    这个问题偶尔会出现。“确保”没有向某个自定义类型分配无效值的唯一方法是在未报告的结构字段中使用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}
    }
    
    类型概率结构{
    第64页
    }
    func NewProbability(p float64)(概率,误差){
    如果p<0 | | p>1{
    返回概率{},errors.New(“无效概率”)
    }
    返回概率{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
    }
    
    func-DidItHappen(p概率)(布尔,错误){
    如果p<0 | | p>1{
    返回false,错误。新建(“无效概率”)
    }
    如果/*掷骰子*/{
    返回真,无
    }
    返回false,无
    }
    
    “它是一个值,因此无法寻址”是不对的。你完全可以处理价值观——它们是你唯一可以处理的东西。你不能解决它,因为它是一个操作的结果;必须先将其分配给变量,然后才能对其进行寻址。这与尝试采用
    &(1+2)
    “如果防止误用,则不会出现任何问题”是一样的——这并不能解决所有问题。它解决了无效概率的问题。
    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
    }