登录 立即注册

首页 > 绿虎论坛 > 电脑 > 讨论/求助 (发帖)

标题: go的值接受体?

作者: @Ta

时间: 2023-06-27

点击: 13704

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


[隐藏样式|查看源码]


『回复列表(12|隐藏机器人聊天)』

1.

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

(/@Ta/2023-06-27 12:54//)

2.

[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 12:55//)

3.

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

(/@Ta/2023-06-27 14:02//)

4.

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

(/@Ta/2023-06-27 17:44//)

5.

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

(/@Ta/2023-06-27 18:43//)

6.

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

(/@Ta/2023-06-27 20:48//)

7.

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

(/@Ta/2023-06-28 09:29//)

8.

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

(/@Ta/2023-06-28 11:06//)

9.

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

(/@Ta/2023-06-28 11:23//)

10.

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

(/@Ta/2023-06-28 11:35//)

11.

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

(/@Ta/2023-06-29 00:30//)

12.

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

(/@Ta/2023-06-29 08:26//)

回复需要登录

11月17日 05:15 星期天

本站由hu60wap6华为CPU驱动

备案号: 京ICP备18041936号-1