猿问

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


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


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


MM们
浏览 287回答 1
1回答

翻翻过去那场雪

是的,使用指针接收器: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上试试这些。
随时随地看视频慕课网APP

相关分类

Go
我要回答