为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 运算符重载

Golang 运算符重载

Go
MM们 2021-11-15 15:45:03
我知道 golang 不提供运算符重载,因为它认为它会增加复杂性。所以我想直接为结构实现它。package mainimport "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 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

是的,使用指针接收器:


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上试试这些。


查看完整回答
反对 回复 2021-11-15
  • 1 回答
  • 0 关注
  • 286 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信