Golang运算符重载

时间:2015-10-09 14:11:46

标签: go methods struct operator-overloading

据我所知,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

从上面的代码中, AddValue 可以按我的意愿运行。但是,我唯一担心的是它是一个值传递,因此我必须每次都返回新增的值。

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

1 个答案:

答案 0 :(得分:15)

是的,使用指针接收器:

params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
            mCamera.setParameters(params);

通过使用指针接收器,类型func (a *A) AddValue(v A) { a.value1 += v.value1 a.value2 += v.value2 } 的值的地址将被传递,因此如果你修改了指向的对象,你不必返回它,你将修改& #34;原"对象而非副本。

您也可以简单地将其命名为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()的简写。请在maximum上尝试这些。