何时显式实例化结构?

时间:2017-10-15 21:30:58

标签: go

我来自Java,你总是这样做:

Http http = new Http(...);

http.ListenAndServe();

所以所有信息都存储在本地变量" http"。

它与众不同。大多数信息都直接存储在另一个包中,并且#34;。

你这样做:

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

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

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

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

是否有任何好的文档/教程可以解释它?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我真的建议您阅读net/http的{​​{3}}。该软件包功能丰富,可让您按照自己的意愿行事。

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

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

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