2017-10-15 94 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

我不知道是否有硬性規定來回答你的問題。當這些條件之一成立時,我通常使用工廠方法:

  • 我需要在實例使用之前對屬性的值進行一些理智檢查;
  • 我想使用意外的屬性,在這種情況下解決它們的唯一方法是在同一個包中。