我知道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 } |
通过使用指针接收器,将传递类型为
您也可以简单地将其命名为
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} |
笔记
请注意,即使您现在有了一个指针接收器,如果非指针值是可寻址的,您仍然可以对非指针值调用
1 2 3 | a, b := A{1, 2}, A{3, 4} a.Add(&b) fmt.Println(a) |
- 大。 这按预期工作。 问题:当我也将参数用作指针时,通过将其作为引用而不是值传递,将对性能有所帮助。
- @Sundar在小结构的情况下没关系,您不应该在意。 如果您的结构很大,那么可以(可能)有所帮助。 有关该主题的讨论,请参见参数与返回值中的指针与值。