Go 何时显式实例化结构?

Go 何时显式实例化结构?,go,Go,我来自爪哇,在那里你总是做这样的事情: Http http = new Http(...); http.ListenAndServe(); 因此,所有信息都存储在局部变量“http”中 围棋不一样。在那里,大部分信息直接存储在“另一个包”中 你可以: import "net/http" ... http.ListenAndServe(...) 因此,您不必显式(也可以)实例化服务器结构。只需从包中调用一个函数,所有结构都将从那里创建。(因此与Java相比,它的行为类似于带有静态成员

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

Http http = new Http(...);

http.ListenAndServe();
因此,所有信息都存储在局部变量“http”中

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

你可以:

import "net/http"
...    
http.ListenAndServe(...)
因此,您不必显式(也可以)实例化服务器结构。只需从包中调用一个函数,所有结构都将从那里创建。(因此与Java相比,它的行为类似于带有静态成员变量的静态函数来存储所有信息?)

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

一切皆有可能,但地道的golang代码是什么


有什么好的文档/教程可以解释吗?

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

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

我真的建议你阅读
net/http
。该软件包功能非常丰富,可以让您随心所欲

http.listendandserve
的行为是隐式使用名为
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,
}
这两种方法都完全是惯用的,我经常看到它们被使用


但是说真的,不要相信我的话。看看这些文档,它们有很多例子:)

通常规则是,如果您需要任何高级配置,您可以实例化对象,它将具有用于配置的函数和属性,并且在默认值足够适合您的用例时,使用包函数在没有实例的情况下使用该功能。请参观Go。关于你的问题:所有变体都有它们的用途,没有一个是惯用的或不惯用的。
log.Fatal(s.ListenAndServe())