go的值接受体?

c
@Ta 2023-06-27 8147点击

感觉作用不大,毕竟新建一个类,肯定是想着用类本身变量
掌缘生灭(白)

回复列表(12|隐藏机器人聊天)
  • @Ta / 2023-06-27 / /

    @ChatGPT,什么是go的值接受体

  • @Ta / 2023-06-27 / /

    [GPT-3.5] [新会话] @加勒比海带,在Go语言中,方法可以与类型关联,这些方法称为接收者方法(receiver methods)。接收者方法可以定义在任何自定义类型上,而不仅限于结构体。

    接收者方法分为两种类型:值接收者(value receiver)和指针接收者(pointer receiver)。在本回答中,我们将重点讨论值接收者。

    值接收者是一种方法,它的接收者是类型的一个副本(值)。当方法被调用时,该副本作为接收者传递给方法。值接收者使用类型的值进行操作,不会对原始类型进行修改。

    以下是一个使用值接收者的简单示例:

    package main
    
    import "fmt"
    
    type Rectangle struct {
        width  float64
        height float64
    }
    
    // 值接收者方法
    func (r Rectangle) Area() float64 {
        return r.width * r.height
    }
    
    func main() {
        rect := Rectangle{width: 10, height: 5}
        fmt.Println("矩形的面积:", rect.Area())
    }
    

    在上面的示例中,Rectangle 结构体定义了一个 Area() 方法,使用值接收者 r Rectangle。该方法计算矩形的面积并返回结果。在 main() 函数中,我们创建了一个矩形实例 rect,并通过调用 rect.Area() 方法来计算矩形的面积。

    请注意,在调用 Area() 方法时,我们直接使用 rect 的值作为接收者,而不是使用指针。这意味着方法在内部使用的是 rect 的副本而不是对原始实例的引用。因此,方法中对 rect 的修改不会影响原始实例。

    值接收者适用于不需要修改类型状态的方法,以及对类型的副本进行操作的情况。

  • @Ta / 2023-06-27 / /

    嗯,我也觉得没用,因为我没基本都是*
    https://www.chengyao.xyz

  • @Ta / 2023-06-27 / /

    在一些比较大的变量下,用 * 可以避免内存拷贝
    ~~~

  • @Ta / 2023-06-27 / /

    如果对象很小,可以直接放在寄存器上(<=64位),用值接收者可以更快,因为可以优化为寄存器拷贝,避免了内存寻址。如果用指针接收者,就必须为对象分配内存地址,会稍慢。

  • @Ta / 2023-06-27 / /

    @老虎会游泳 对于Golang而言,对象内存的分配在哪儿是不可控的吧,因为都是由 runtime 来负责内存分配;对于小对象,runtime 内部有针对小尺寸的分配策略。
    ~~~

  • @Ta / 2023-06-28 / /

    @㝶芾厶眵攴䭡,如果编译时已经优化成寄存器拷贝了,就不会有内存分配了。

  • @Ta / 2023-06-28 / /

    @老虎会游泳 好吧,1.17版本新特性,又学到了新知识。
    ~~~

  • @Ta / 2023-06-28 / /

    @㝶芾厶眵攴䭡,我其实不知道是新特性,只是做理论分析。

  • @Ta / 2023-06-28 / /

    @老虎会游泳 骗我感情鸡哔你,罚你三小时不能喝水。
    ~~~

  • c
    @Ta / 2023-06-29 / /

    @老虎会游泳,但是我想了一下,值接受体没法保证原子性,比如说,值接受体是拷贝原类副本,拷贝过程中如果旧类改变了么,指针接受体不会有这个问题
    掌缘生灭(白)

  • @Ta / 2023-06-29 / /

    @c,本来就不应该做这种改变。如果可能会改变又没加锁,就是bug。

添加新回复
回复需要登录