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
- 1 回答
- 0 關注
- 111 瀏覽
添加回答
舉報