【发布时间】:2017-06-13 04:45:22
【问题描述】:
我已经学习 GO 语言一个月了。我已经用 java 编码超过 4 年了。在 java 中,Request 和 Response 都是对象引用。但是,对于 GoLang,Response 是对象引用,Request 是指针引用。
引用和指针一样,是一个可以用来间接引用另一个对象的对象。引用声明与指针声明的语法结构基本相同。
func hello(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Hello world!")
}
除了可读性和语法糖之外,使用 Request 作为指针变量还有其他意图。
除了上面的问题,这里的请求是一个任意指针。即请求尚不存在,但指针已指向内存位置。如果我的理解有误,请多指教。
【问题讨论】:
-
golang 中没有引用,只有指针。并且所有参数都是按值传递的。
-
@zzn 我没想到会有一个客观的答案。能否请您抽出宝贵的时间来详细说明一下?
-
正如@zzn 所说:Go 完全没有“通过引用传递”的概念,因此在 Go 中谈论或推理引用毫无意义。推测 Go 将如何从“引用”中获利是非常深奥的(因为它不会发生)。
http.Request上的几个方法修改了请求,因此需要一个指针接收器,因此请求在任何地方都作为指针处理。这称为一致性,与语法糖或可读性无关。 -
关于附加问题“如果我的理解有误,请多指教。”是的,完全。
r是指向某个现有请求还是 nil(没有其他选项)取决于hello的调用方式,仅此而已。从tour.golang.org/moretypes/1开始,通过 Tour of Go 了解指针工作