2017-10-15 56 views
-1

我是来自Java的未来,还有你总是做这样的事情:何时显式实例化结构?

Http http = new Http(...); 

http.ListenAndServe(); 

因此,所有的信息都存储在本地变量“HTTP”。

这是不同的去。大部分信息直接存储在“另一个包”中。

你这样做:

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

所以你不要有明确的(当然,你可以)实例的服务器结构。只需从包中调用一个函数并从那里创建所有结构。 (所以与Java相比,它的行为类似静态成员变量来存储所有信息的静态函数?)

所以这就是你如何去做(每次)? 来自Java,这有点难以理解。 尤其是当使用这种方法,当使用工厂模式(如:NewHttpServer(...)),当从另一个包明确创建一个结构(如:var http http.Server = http.Server{...}

一切是可能的,但什么是地道golang码?

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

+2

通常的规则是,如果你需要任何预先配置你实例化对象,它将具有配置的功能和属性,并使用包函数来使用功能一个默认值足以满足您的用例的实例。 – Topo

+1

走走走。关于你的问题:所有的变体都有它们的用途,没有一个是惯用的。 – Volker

回答

0

我真的建议阅读Godocnet/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()) 

这两种方法是完全地道,我他们看到他们经常使用。

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

1

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

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