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

时间:2018-03-30 10:03:46

标签: 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{}

2 个答案:

答案 0 :(得分:0)

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

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

然而,与C / C ++相比,Go中的指针是使用<{1}} 前面的类型而不是跟随它来声明的。

您可以在此处详细了解指针: https://en.wikipedia.org/wiki/Pointer_(computer_programming)

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

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

其他一些语言(如Java)有内部方法可以隐藏用户的指针问题,或根本不使用它们。在这种情况下,他们经常需要垃圾收集器。但是让用户决定使用指针(虽然它也有一个垃圾收集器)。

答案 1 :(得分:-2)

*用于取消引用指针,&用于获取值的地址。看看Golang巡回赛 Request是http包中的结构:

type Request struct {}

*Request作为指向以下代码中结构的指针返回:

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

您应该在https://golang.org/src/net/http/request.go {。}找到request.go的资源。

  

为什么不只是客户端:= http.Client {}?

我们使用&地址运算符和客户端来设置struct的值以更改Client结构的值。如果我们不接受地址它将创建结构的副本而不是使用原始结构。

浏览Client struct有一个字段的想法