我知道 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上试试这些。
- 1 回答
- 0 关注
- 286 浏览
添加回答
举报
0/150
提交
取消