gpt4 book ai didi

go - 您可以防止创建无效的自定义类型吗?

转载 作者:数据小太阳 更新时间:2023-10-29 03:40:17 25 4
gpt4 key购买 nike

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

  1. 是否有任何方法可以防止这种规避,以便如果您有一个 Probability 它总是有效的?
  2. 与主要问题无关:如果我在构造函数中省略 tmp 变量,而是执行 return &Probability(p), nil,我会得到错误 cannot获取 Probability(p) ( Try it ) 的地址。为什么在使用 tmp 变量时不会出现此错误?

最佳答案

Can you prevent an invalid custom type from being created?

没有。

“经典”OOP 语言提倡的想法是,如果您防止误用,就不会出现任何问题,这是没有根据的。如果用户不阅读你的文档,就会出现问题。

关于go - 您可以防止创建无效的自定义类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57822520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com