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

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

在結構方法中更改后設置為零的指針值

在結構方法中更改后設置為零的指針值

Go
一只萌萌小番薯 2022-08-01 17:29:57
這是我的代碼:type Cake struct {    weight      int    value       int    costBenefit float32}func (c *Cake) SetCostBenefit() float32 {    if c.costBenefit == 0 {        c.costBenefit = float32(c.value) / float32(c.weight)    }    return c.costBenefit}func main() {    capacity := 20    cakes := []Cake{{weight: 7, value: 160}, {weight: 3, value: 90}, {weight: 2, value: 15}}    result := maxDuffelBagValue(cakes, capacity)    fmt.Printf("Max capacity %d", result)}func maxDuffelBagValue(cakes []Cake, capacity int) int {    calcCostBenefit(&cakes)    for _, c := range cakes {        fmt.Printf("Value Cake cost benefit 2: %v \n", c.costBenefit)    }    return 0}func calcCostBenefit(cakes *[]Cake) {    for _, c := range *cakes {        c.SetCostBenefit()        fmt.Printf("Value Cake cost benefit 1: %v \n", c.costBenefit)    }}正如您在上面看到的,我有一個結構方法,用于設置結構蛋糕的 CostBenefit 屬性。由于我將蛋糕數組發送到方法calcCostBenefit,因此方法中的任何更改都應反映外部的數組(調用方方法)。但實際上,這并沒有發生。下面是輸出:Value Cake cost benefit 1: 22.857143Value Cake cost benefit 1: 30Value Cake cost benefit 1: 7.5Value Cake cost benefit 2: 0Value Cake cost benefit 2: 0Value Cake cost benefit 2: 0 值重置為零,我不知道為什么。我嘗試了代碼中的一些更改,但沒有任何效果。我在這里錯過了什么?這讓我發瘋,沒有任何東西能夠發現可能如此明顯和簡單的東西。
查看完整描述

1 回答

?
森欄

TA貢獻1810條經驗 獲得超5個贊

在提供的示例中,for 范圍循環將基礎項的值復制到一個新變量 () 中 — 隨后在下面的示例中打印出來:slicearrayc


fmt.Printf("Value Cake cost benefit 1: %v \n", c.costBenefit)

您可以使用 獲取指向 中某個條目的指針。請注意 s 和 s 之間的區別,特別是當復制 s 時,基礎保持不變:slicec := &cakes[i]slicearrayslicearray


...如前所述,重新切片不會創建基礎數組的副本。整個數組將保留在內存中,直到不再被引用。有時,這可能會導致程序在只需要一小部分數據時將所有數據保存在內存中。...


https://blog.golang.org/slices-intro#TOC_6。


因此,如果只是嘗試更改數組中的基礎值(由 .sliceslice


所以,這個:


func maxDuffelBagValue(cakes []Cake, capacity int) int {


    calcCostBenefit(&cakes)


    for _, c := range cakes {

        fmt.Printf("Value Cake cost benefit 2: %v \n", c.costBenefit)

    }


    return 0

}


func calcCostBenefit(cakes *[]Cake) {

    for _, c := range *cakes {

        c.SetCostBenefit()

        fmt.Printf("Value Cake cost benefit 1: %v \n", c.costBenefit)

    }

}


變成這樣:


func maxDuffelBagValue(cakes []Cake, capacity int) int {

    calcCostBenefit(cakes)


    for _, c := range cakes {

        fmt.Printf("Value Cake cost benefit 2: %f \n", c.costBenefit)

    }


    return 0

}


func calcCostBenefit(cakes []Cake) {

    for i, _ := range cakes {

        c := &cakes[i]

        c.SetCostBenefit()

        fmt.Printf("Value Cake cost benefit 1: %v \n", c.costBenefit)

    }

}

輸出:


Value Cake cost benefit 1: 22.857143 

Value Cake cost benefit 1: 30 

Value Cake cost benefit 1: 7.5 

Value Cake cost benefit 2: 22.857143 

Value Cake cost benefit 2: 30.000000 

Value Cake cost benefit 2: 7.500000 


以下方法也有效:


func calcCostBenefit(cakes *[]Cake) {

    for idx, _ := range *cakes {

    c := &(*cakes)[idx]

        c.SetCostBenefit()

        fmt.Printf("Value Cake cost benefit 1: %v \n", c.costBenefit)

    }

}

...但鑒于上面的替代方案,它更復雜。但是,如果由于任何原因(外部包)無法更改方法簽名,則可能需要執行此操作。


https://play.golang.org/p/7OVw_IH2B0l


查看完整回答
反對 回復 2022-08-01
  • 1 回答
  • 0 關注
  • 111 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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