据我所知,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按我的意愿工作.但是,我唯一担心的是它是一个值传递,因此我必须每次都返回新增加的值.
还有其他更好的方法,以避免返回总结变量.
最近读了《Go编程语言书》,这是学习golang编程语言的好资源。\n6.2节中有一段关于类型的复制实例T在方法中是否是指针接收者时类型的复制实例,我无法理解。 \n有没有用一个有意义的例子来解释这一段?
\n\n6.2 使用指针接收器的方法
\n\n如果命名类型 T 的所有方法都有 T 本身的接收者类型(不是 *T ),则复制该类型的实例是安全的;调用它的任何方法都必然会生成一个副本。例如,time.Duration 值可以自由复制,包括作为函数的参数。但是,如果任何方法具有指针接收器,则应避免复制 T 的实例,因为这样做可能会违反内部不变量。例如,复制 bytes.Buffer 的实例将导致原始和副本为相同的底层字节数组别名( \xc2\xa72.3.2 )。后续的方法调用将产生不可预测的效果。
\n\n(Go 编程语言 Alan AA Donovan \xc2\xb7 Brian W. Kernighan)
\n