3 回答

TA貢獻1869條經(jīng)驗 獲得超4個贊
您可以防止創(chuàng)建無效的自定義類型嗎?
不。
“經(jīng)典”O(jiān)OP 語言所提倡的“如果防止誤用就不會出現(xiàn)問題”的想法是沒有根據(jù)的。如果用戶不閱讀您的文檔就會出現(xiàn)問題。

TA貢獻2003條經(jīng)驗 獲得超2個贊
1)您可以嘗試將 Probability 設(shè)為一個包含隱藏浮點值的結(jié)構(gòu),但您將無法將其用作數(shù)字。另一種選擇是將 IsValid() 方法添加到 Probability(有點類似于 NaN)。
2) Probability(p) 是 p 的副本,類型為 Probability。它是一個運算結(jié)果的值,在分配給變量之前沒有地址。當您將其分配給變量時,您可以獲得該變量的地址。

TA貢獻1848條經(jīng)驗 獲得超10個贊
這個問題每隔一段時間就會出現(xiàn)一次?!按_?!辈粫o效值分配給某些自定義類型的唯一方法是在未導出的結(jié)構(gòu)體字段中使用 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}
}
對于像浮動這樣簡單的東西來說,這可能有點過分了。更明智的方法通常是檢查每當您接受這樣的參數(shù)時是否收到有效的概率:
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 關(guān)注
- 180 瀏覽
添加回答
舉報