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())