第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

您可以防止創(chuàng)建無效的自定義類型嗎?

您可以防止創(chuàng)建無效的自定義類型嗎?

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

3 回答

?
MMTTMM

TA貢獻1869條經(jīng)驗 獲得超4個贊

您可以防止創(chuàng)建無效的自定義類型嗎?

不。

“經(jīng)典”O(jiān)OP 語言所提倡的“如果防止誤用就不會出現(xiàn)問題”的想法是沒有根據(jù)的。如果用戶不閱讀您的文檔就會出現(xiàn)問題。



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

TA貢獻2003條經(jīng)驗 獲得超2個贊

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

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



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

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

}


查看完整回答
反對 回復 2023-07-17
  • 3 回答
  • 0 關(guān)注
  • 180 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號