9

我期待看到3,这是怎么回事?

package main

import "fmt"

type Counter struct {
    count int
}

func (self Counter) currentValue() int {
    return self.count
}
func (self Counter) increment() {
    self.count++
}

func main() {
    counter := Counter{1}
    counter.increment()
    counter.increment()

    fmt.Printf("current value %d", counter.currentValue())
}

http://play.golang.org/p/r3csfrD53A

4

2 回答 2

28

您的方法接收器是一个结构值,这意味着接收器在调用时会获得该结构的副本,因此它会增加副本并且您的原始值不会更新。

要查看更新,请将您的方法放在结构指针上。

func (self *Counter) increment() {
    self.count++
}

Nowself是指向counter变量的指针,因此它将更新其值。


http://play.golang.org/p/h5dJ3e5YBC

于 2013-05-17T14:01:39.313 回答
1

我想添加到@user1106925 响应。

如果您需要在地图中使用自定义类型,则需要使用指向指针的地图。因为for l,v :=range yourMapType将收到结构的副本。

这是一个示例:

package main

import "fmt"

type Counter struct {
        Count int
}

func (s *Counter) Increment() {
        s.Count++
}

func main() {
        // Using map to type
        m := map[string]Counter{
                "A": Counter{},
        }

        for _, v := range m {
                v.Increment()
        }
        fmt.Printf("A: %v\n", m["A"].Count)

        // Now using map to pointer
        mp := map[string]*Counter{
                "B": &Counter{},
        }

        for _, v := range mp {
                v.Increment()
        }
        fmt.Printf("B: %v\n", mp["B"].Count)
}

输出是:

$ go build && ./gotest
A: 0
B: 1
于 2021-08-13T23:29:37.457 回答