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 关注
- 91 浏览
添加回答
举报