Golang运算符重载

Sun*_*dar 5 methods struct operator-overloading go

据我所知,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)
}
Run Code Online (Sandbox Code Playgroud)

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

从上面的代码中,AddValue按我的意愿工作.但是,我唯一担心的是它是一个值传递,因此我必须每次都返回新增加的值.

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

icz*_*cza 17

是的,使用指针接收器:

func (a *A) AddValue(v A) {
    a.value1 += v.value1
    a.value2 += v.value2
}
Run Code Online (Sandbox Code Playgroud)

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

你也可以简单地命名它Add().你也可以使它的参数成为指针(为了保持一致性):

func (a *A) Add(v *A) {
    a.value1 += v.value1
    a.value2 += v.value2
}
Run Code Online (Sandbox Code Playgroud)

所以使用它:

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

x.Add(y)

fmt.Println(x)  // Prints &{4 6}
Run Code Online (Sandbox Code Playgroud)

笔记

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

a, b := A{1, 2}, A{3, 4}
a.Add(&b)
fmt.Println(a)
Run Code Online (Sandbox Code Playgroud)

a.Add()是一个简写(&a).Add().在Go Playground尝试这些.

  • @Sundar如果是小结构,那没关系,你不应该在乎.如果你的结构很大,那么是的,它可能有帮助.有关该主题的讨论,请参阅[指针与参数和返回值中的值](http://stackoverflow.com/questions/23542989/pointers-vs-values-in-parameters-and-return-values). (2认同)