go - Go中的 '*'和 '&'符号是什么意思?

标签 go

我无法理解 Go 中的 *& 符号。我理解指针接收器允许我们修改接收器指向的值的概念:

type Vertex struct {
    X, Y float64
}

// This adjust the value of v.X and v.Y
func (v *Vertex) Scale(f float64) {
    v.X = v.X * f
    v.Y = v.Y * f
}

但我也看到返回指针接收器的函数,例如 net/http 库。

func NewRequest(method, url string, body io.Reader) (*Request, error)

在这种情况下,为什么返回的Request前面有一个星号?

另外,我经常看到&在赋值变量的时候使用

import net/http
client := &http.Client{}

为什么不只是 client := http.Client{}

最佳答案

看看这里:https://tour.golang.org/moretypes/1

Go 使用类似于 C 或 C++ 的指针。 * 符号用于声明指针和取消引用。 &符号指向存储值的地址。

然而,与 C/C++ 相比,Go 中的指针是在 * 之前声明的,而不是在类型之后。

您可以在此处阅读有关指针的更多信息: https://en.wikipedia.org/wiki/Pointer_(computer_programming)

在您的示例中,它们用于传递对象实例的地址,而不是复制实例。这样效率更高,而且您不会遇到拥有 2 个副本对象的问题,因为在这种情况下您只需要一个副本,并且需要销毁其中一个。

这是因为 Object 的实例位于内存中的特定地址,如果您想准确引用该对象,则必须传递地址而不是对象本身。

一些其他语言(如 Java)有内部方法来向用户隐藏指针问题或根本不使用它们。在这种情况下,他们通常需要垃圾收集器。然而,Go 让用户决定使用指针(尽管它也有一个垃圾收集器)。

关于go - Go中的 '*'和 '&'符号是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49572378/

相关文章:

go - Kadmelia K-Bucket 算法中的路由表,无需遍历节点 ID 中的每一位

heroku - 使用 Heroku 部署 Go 应用

unit-testing - 我如何对这个用 golang 编写的 promptui 包进行单元测试?

go - 原型(prototype)请求中枚举的输入验证

go - Gitlab CI 和 Go 模块

go - gorilla Mux相同端点多个查询参数

types - Go 中的别名类型仅在未命名时才可分配?

go - 如何将一个 slice 与其他 slice 进行比较以查看内容是否匹配

go - 是否有更有效的方法来处理此函数中的字符串转义?

go - 限制持续时间粒度