Golang运算符重载

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

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

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

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

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

回答:

是的,使用指针接收器:

func (a *A) AddValue(v A) {

a.value1 += v.value1

a.value2 += v.value2

}

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

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

func (a *A) Add(v *A) {

a.value1 += v.value1

a.value2 += v.value2

}

因此使用它:

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

x.Add(y)

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

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

a, b := A{1, 2}, A{3, 4}

a.Add(&b)

fmt.Println(a)

a.Add()是的简写(&a).Add()。在Go

Playground上尝试一下。

以上是 Golang运算符重载 的全部内容, 来源链接: utcz.com/qa/434671.html

回到顶部