当前位置: 首页 > 面试题库 >

为什么必须将http.Request参数用作指针?

巴照
2023-03-14
问题内容
package main

import (
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request){
        w.Write([]byte("hello world"))
    })
    http.ListenAndServe(":8000", nil)
}

如果我删除*in http.Request

github.com/creating_web_app_go/main.go:8:不能在http.HandleFunc的参数中使用func文字(类型func(http.ResponseWriter,http.Request))作为func(http.ResponseWriter,*
http.Request)类型。

我对Go和指针都很陌生。

所以问题是,为什么必须http.Request是指针而不是func literal?谁能以最简单的方式解释这一点,也许还会引用源代码?


问题答案:

因为它是一个大结构。复制它会很昂贵。因此,它是指向结构的指针,当结构很大时,这在Go中很常见。它还具有某种状态,因此如果将其复制,可能会造成混淆。成为一个有趣的字面意义是没有意义的。我不明白为什么这是一个选择。



 类似资料:
  • 问题内容: 每个人都告诉我“使用super.viewDidLoad()因为它就是这样”或“我一直那样做,所以要保留它”,“如果不叫super就是错误的”等。 我只发现了一些有关Objective-C用例的主题,这些主题并没有那么启发性,但是我正在Swift 3中进行开发,所以有什么专家可以给我一个很好的详细解释吗? 这是一种良好实践的案例还是有任何隐藏的影响? 问题答案: 通常,最好为您覆盖的所有

  • 问题内容: 有时我们有几个类,这些类的某些方法具有相同的签名,但是与声明的Java接口不对应。例如,和(在中的其他几个 )中都有一个方法 现在,假设我希望对具有该方法的对象进行一些操作。然后,我想有一个接口(或者自己定义),例如 这样我可以写: 但是,可悲的是,我不能: 此演员表将是非法的。编译器 知道 这 是不是 一个,因为类没有宣布实现该接口...... 然而“实际上”实现它 。 有时这会带来

  • 问题内容: 即使等待1的linux手册页很好地说明了您需要让子进程不使其变成僵尸,但它根本无法说明原因。 我围绕一个Ever 循环计划了我的程序(这是我的第一个多线程程序,所以请原谅我的天真),该循环启动子进程,该子进程被ed淘汰,并确保自行终止。 我无法使用,因为这使并行计算变得不可能,因此我可能不得不添加一个存储子pid的进程表,并且不得不使用-不是立即执行,而是经过一段时间- 这是一个问题,

  • 关于在最新版本的GCC和Clang中编译有几个问题:实验::filessystems链接器错误 但是现在< code>filesystem已经被c 17接受,所以不再需要< code>experimental或< code>-lstdc fs标志,对吗? 错了,我甚至不能 只给了我< code >实验版本,我怎么能包括正式接受的版本呢?

  • 问题内容: 在我看到的所有支持可选参数的编程语言中,都有一个模仿,即可选参数必须出现在声明的末尾。可选项目后不得包含必需的参数。是什么原因呢?我想这可能是编译器/解释器的要求。 问题答案: 好吧,如果它们在最前面,您将如何检测何时停止供应它们?唯一的方法是 在 可选参数 之后 变量类型是否不同。有点不可思议的要求,因此您只需将它们强制设置为最后是有意义的(省去了用于检测“最终”可选参数的复杂规则的

  • 考虑以下示例: 问题来了:上例中的lambda参数是稍后将在“display()”方法内执行的对象。将参数传递给“display()”时,它显然不会执行。 为什么它被编译器拒绝?我认为只有在实际调用lambda时,用try... catch来包围它是很合理的。