服务器是否需要是一个指针

根据http#Server.ListenAndServe 文档

func (*Server) ListenAndServe

将 server 作为指针

根据[ https://golang.org/pkg/net/http/],似乎服务器应该被创建为指针

server := &http.Server{

    Addr:              ":8080",

    Handler:           nil,

    TLSConfig:         nil,

    .....

}

但是,这工作得很好。我在这里缺少什么?


    server := http.Server{

    Addr:              ":8080",

    Handler:           nil,

    ......

}


if err := server.ListenAndServe(); err!=nil{

    log.Fatal("oh Dear!")

}


慕慕森
浏览 72回答 3
3回答

扬帆大鱼

请参阅“使用指针接收器调用函数的 Go 语法”,以及规范:“方法集”对应指针类型的方法集是所有接收者为或 的*T方法的集合(即还包含 的方法集)。*TTT所以对于和func (*Server) ListenAndServe都适用。Server*Server

一只斗牛犬

这两个示例都使用 的地址http.Server。第一个示例明确采用 的地址http.Server。在第二个示例中,调用 server.ListenAndServe()是 的简写(&server).ListenAndServe()。以下是速记规范中的相关文本:如果 x(的类型)的方法集包含 m 并且参数列表可以分配给 m 的参数列表,则方法调用 xm() 是有效的。如果 x 是可寻址的并且 &x 的方法集包含 m,则 xm() 是 (&x).m() 的简写应用短句柄是因为变量server是可寻址的并且&server其方法集包含ListenAndServe()。

一只名叫tom的猫

该方法是使用指针接收器定义的,这意味着必须在可寻址接收器上调用它。因此,例如:func f() http.Server {...} f().ListenAndServe()行不通。你打电话时:server.ListenAndServe()该方法接收的是地址server而不是它的副本。
打开App,查看更多内容
随时随地看视频慕课网APP