何时显式实例化结构



我来自Java,你总是在那里做这样的事情:

Http http = new Http(...);
http.ListenAndServe();

因此,所有信息都存储在局部变量"http"中。

围棋就不一样了。在那里,大部分信息直接存储在"另一个包中"。

是吗:

import "net/http"
...    
http.ListenAndServe(...)

因此,您不必显式(好吧,您可以)实例化服务器结构。只需从包中调用一个函数,所有结构都将从那里创建。(所以与Java相比,它就像静态函数一样,带有静态成员变量来存储所有信息?

所以这就是你(每次)在围棋中的做法?来自Java,这有点难以理解。特别是当使用此方法时,何时使用工厂模式(如:NewHttpServer(...))以及何时从另一个包显式创建结构(如:var http http.Server = http.Server{...}

一切皆有可能,但什么是惯用的 golang 代码?

有没有好的文档/教程来解释它?

我不知道

是否有硬性规定来回答你的问题。当以下条件之一成立时,我通常使用工厂方法:

  • 我需要在使用实例之前对属性的值进行一些健全性检查;
  • 我想使用意外的属性,在这种情况下,解决它们的唯一方法是从同一个包中。

我真的建议阅读Godoc for net/http .该软件包功能非常丰富,可让您做您想做的事。

http.ListenAndServe的行为是隐式使用称为DefaultServeMux的服务多路复用器,您可以在其上向http.Handle注册处理程序。因此,您不能像这样显式地处理服务器或多路复用器。

听起来你想要的(一个更像Java的解决方案)是实例化服务器

s := &http.Server{
    Addr:           ":8080",
    Handler:        myHandler,        // takes a path and a http.HandlerFunc
    ReadTimeout:    10 * time.Second, // optional config
    WriteTimeout:   10 * time.Second, // ...
    MaxHeaderBytes: 1 << 20,
}

并就此致电ListenAndServe

log.Fatal(s.ListenAndServe())

这两种方式都是完全惯用的,我看到它们经常使用。

但说真的,不要相信我的话。去看看文档,他们有很多例子:)

最新更新