我知道golang不会提供运算符重载,因为它认为这会增加复杂性。

所以我想直接对结构实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package main

import"fmt"

type A struct {
    value1 int
    value2 int
}

func (a A) AddValue(v A) A {
    a.value1 += v.value1
    a.value2 += v.value2
    return a
}


func main() {
    x, z := A{1, 2}, A{1, 2}
    y := A{3, 4}

    x = x.AddValue(y)

    z.value1 += y.value1
    z.value2 += y.value2

    fmt.Println(x)
    fmt.Println(z)
}

https://play.golang.org/p/1U8omyF8-V

通过上面的代码,AddValue可以按我的方式工作。 但是,我唯一关心的是它是按值传递的,因此我每次必须返回新添加的值。

还有其他更好的方法,以避免返回汇总变量。

  • 是的,使用指针接收器。

是的,使用指针接收器:

1
2
3
4
func (a *A) AddValue(v A) {
    a.value1 += v.value1
    a.value2 += v.value2
}

通过使用指针接收器,将传递类型为A的值的地址,因此,如果修改指向的对象,则不必返回它,则将修改"原始"对象而不是副本 。

您也可以简单地将其命名为Add()。 您还可以使其参数作为指针(为了保持一致性):

1
2
3
4
func (a *A) Add(v *A) {
    a.value1 += v.value1
    a.value2 += v.value2
}

因此使用它:

1
2
3
4
5
x, y := &A{1, 2}, &A{3, 4}

x.Add(y)

fmt.Println(x)  // Prints &{4 6}

笔记

请注意,即使您现在有了一个指针接收器,如果非指针值是可寻址的,您仍然可以对非指针值调用Add()方法,因此例如,以下内容也适用:

1
2
3
a, b := A{1, 2}, A{3, 4}
a.Add(&b)
fmt.Println(a)

a.Add()(&a).Add()的简写。 在Go Playground上尝试这些。

  • 大。 这按预期工作。 问题:当我也将参数用作指针时,通过将其作为引用而不是值传递,将对性能有所帮助。
  • @Sundar在小结构的情况下没关系,您不应该在意。 如果您的结构很大,那么可以(可能)有所帮助。 有关该主题的讨论,请参见参数与返回值中的指针与值。