Golang 运算符重载

标签 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 可以正常工作。但是,我唯一担心的是它是按值传递的,因此我每次都必须返回新添加的值。

是否有其他更好的方法,以避免返回求和变量。

最佳答案

是的,使用指针接收器:

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/

相关文章:

javascript - 将 Javascript 变量的值发送到 Go 变量中

c - Typedef 结构问题

Go - append 到结构上的 slice 不会持续存在

c# - 将 Color32[] 数组快速复制到 byte[] 数组

go - 在 connect-go 拦截器中修改 responsebody

node.js - 在 golang 中为 http 响应创建自定义错误

methods - 扩展ABAP中重写方法的接口(interface)

java - 打印数组错误

c++ - 为什么静态数组成员变量在调用对象的实例后不显示任何内容?

shell - 有 Golang 终端 shell 吗?编译语言有可能吗?