相关疑难解决方法(0)

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)
}
Run Code Online (Sandbox Code Playgroud)

https://play.golang.org/p/1U8omyF8-V

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

还有其他更好的方法,以避免返回总结变量.

methods struct operator-overloading go

5
推荐指数
1
解决办法
1万
查看次数

当命名类型 T 的任何方法具有指针接收器时,复制类型 T 的实例

最近读了《Go编程语言书》,这是学习golang编程语言的好资源。\n6.2节中有一段关于类型的复制实例T在方法中是否是指针接收者时类型的复制实例,我无法理解。 \n有没有用一个有意义的例子来解释这一段?

\n\n
\n

6.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
\n

methods pointers go

4
推荐指数
1
解决办法
648
查看次数

标签 统计

go ×2

methods ×2

operator-overloading ×1

pointers ×1

struct ×1