一尘不染

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

go

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?谁能以最简单的方式解释这一点,也许还会引用源代码?


阅读 275

收藏
2020-07-02

共1个答案

一尘不染

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

2020-07-02