2 回答

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超5個(gè)贊
它不起作用,因?yàn)槟趶?fù)制并修改副本:
dest := destination_list[i] dest.incrementSBytes(33)
上面,您首先將數(shù)組元素復(fù)制到dest
,然后修改dest
。數(shù)組元素永遠(yuǎn)不會(huì)改變。而是嘗試這個(gè):
destination_list[i].incrementsSBytes(33)

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超9個(gè)贊
所有的魔力都在于range
,它創(chuàng)建該元素的副本,因此修改是不可見(jiàn)的。
package main
import (
? ? "fmt"
? ? "sync"
)
type destination struct {
? ? Name? ? ? ? ? string
? ? SBytesSent? ? int64
? ? ABytesSent? ? int64
? ? LastSeenAlive int64
? ? Mutex? ? ? ? ?*sync.Mutex
}
type destinations []destination
var (
? ? destination_list destinations
? ? myHosts? ? ? ? ? = []string{"host1", "host2", "host3"}
)
func main() {
? ? fmt.Println("Hello, playground")
? ? for i := range myHosts {
? ? ? ? newDest := myHosts[i]
? ? ? ? newd := destination{Name: newDest}
? ? ? ? newd.Mutex = &sync.Mutex{}
? ? ? ? destination_list = append(destination_list, newd)
? ? }
? ? i := 0
? ? for {
? ? ? ? increment()
? ? ? ? status()
? ? ? ? i++
? ? ? ? if i == 3 {
? ? ? ? ? ? break
? ? ? ? }
? ? }
}
func (self *destination) incrementSBytes(a int) {
? ? self.Mutex.Lock()
? ? defer self.Mutex.Unlock()
? ? self.SBytesSent += int64(a)
? ? fmt.Printf("new val %d\n", self.SBytesSent)
}
func (self *destination) Status() {
? ? fmt.Printf("my val %d\n", self.SBytesSent)
}
func increment() {
? ? for i:=0; i<len(destination_list); i++ {
? ? ? ? destination_list[i].incrementSBytes(33)
? ? }
}
func status() {
? ? for i:=0; i<len(destination_list); i++ {
? ? ? ? destination_list[i].Status()
? ? }
}
輸出:
Hello, playground
new val 33
new val 33
new val 33
my val 33
my val 33
my val 33
new val 66
new val 66
new val 66
my val 66
my val 66
my val 66
new val 99
new val 99
new val 99
my val 99
my val 99
my val 99
- 2 回答
- 0 關(guān)注
- 207 瀏覽
添加回答
舉報(bào)