我来自Java,你总是在那里做这样的事情:
Http http = new Http(...);
http.ListenAndServe();
因此,所有信息都存储在局部变量"http"中。
围棋就不一样了。在那里,大部分信息直接存储在"另一个包中"。
是吗:
import "net/http"
...
http.ListenAndServe(...)
因此,您不必显式(好吧,您可以)实例化服务器结构。只需从包中调用一个函数,所有结构都将从那里创建。(所以与Java相比,它就像静态函数一样,带有静态成员变量来存储所有信息?
所以这就是你(每次)在围棋中的做法?来自Java,这有点难以理解。特别是当使用此方法时,何时使用工厂模式(如:NewHttpServer(...)
)以及何时从另一个包显式创建结构(如:var http http.Server = http.Server{...}
)
一切皆有可能,但什么是惯用的 golang 代码?
有没有好的文档/教程来解释它?
是否有硬性规定来回答你的问题。当以下条件之一成立时,我通常使用工厂方法:
- 我需要在使用实例之前对属性的值进行一些健全性检查;
- 我想使用意外的属性,在这种情况下,解决它们的唯一方法是从同一个包中。
我真的建议阅读Godoc for net/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())
这两种方式都是完全惯用的,我看到它们经常使用。
但说真的,不要相信我的话。去看看文档,他们有很多例子:)