我知道 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 可以正常工作。但是,我唯一担心的是它是按值传递的,因此我每次都必须返回新添加的值。
是否有其他更好的方法,以避免返回求和变量。
最佳答案
是的,使用指针接收器:
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 运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33040495/