亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

您可以防止創建無效的自定義類型嗎?

您可以防止創建無效的自定義類型嗎?

Go
交互式愛情 2023-07-17 17:55:33
假設我們想要創建一個自定義Probability類型來表示 0 到 1 之間的數字。我們可以這樣做:type Probability float64func 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_H2個問題:有沒有什么方法可以防止這種規避,這樣即使有的話Probability它也總是有效的?與主要問題無關:如果我tmp在構造函數中省略變量而是這樣做return &Probability(p), nil,則會收到錯誤cannot take the address of Probability(p)(嘗試一下)。為什么使用變量時tmp不會出現此錯誤?
查看完整描述

3 回答

?
MMTTMM

TA貢獻1869條經驗 獲得超4個贊

您可以防止創建無效的自定義類型嗎?

不。

“經典”OOP 語言所提倡的“如果防止誤用就不會出現問題”的想法是沒有根據的。如果用戶不閱讀您的文檔就會出現問題。



查看完整回答
反對 回復 2023-07-17
?
湖上湖

TA貢獻2003條經驗 獲得超2個贊

1)您可以嘗試將 Probability 設為一個包含隱藏浮點值的結構,但您將無法將其用作數字。另一種選擇是將 IsValid() 方法添加到 Probability(有點類似于 NaN)。

2) Probability(p) 是 p 的副本,類型為 Probability。它是一個運算結果的值,在分配給變量之前沒有地址。當您將其分配給變量時,您可以獲得該變量的地址。



查看完整回答
反對 回復 2023-07-17
?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

這個問題每隔一段時間就會出現一次。“確?!辈粫o效值分配給某些自定義類型的唯一方法是在未導出的結構體字段中使用 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

}


查看完整回答
反對 回復 2023-07-17
  • 3 回答
  • 0 關注
  • 164 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號