Go panic:http:static的多个注册/ 请考虑这个问题:
我必须在唯一端口上启动多个侦听器,如:Go panic:http:static的多个注册/ 请考虑这个问题:,go,Go,我必须在唯一端口上启动多个侦听器,如: function launchUI(self *myObject) { fs := http.FileServer(http.Dir(self.staticFs)) http.Handle("/static/", http.StripPrefix("/static/", fs)) go http.HandleFunc("/login", self.loginHandler)
function launchUI(self *myObject) {
fs := http.FileServer(http.Dir(self.staticFs))
http.Handle("/static/", http.StripPrefix("/static/", fs))
go http.HandleFunc("/login", self.loginHandler)
errx := http.ListenAndServeTLS(self.uiport, self.cert, self.key, nil)
if errx != nil {
fmt.Println("http Listen err", errx)
panic("http Listen")
}
}
listOfObjects := []*myObject{}
for _, obj := range(listofObjects){
obj.launchUI()
<snip>
}
你能告诉我如何解决这个问题吗?函数启动界面(self*myObject){
fs:=http.FileServer(http.Dir(self.staticFs))
mux:=http.NewServeMux()
句柄(“/static/”,http.StripPrefix(“/static/”,fs))
mux.HandleFunc(“/login”,self.loginHandler)
errx:=http.listendandservetls(self.uiport、self.cert、self.key、mux)
如果errx!=nil{
fmt.Println(“http侦听错误”,errx)
恐慌(“http监听”)
}
}
为每个侦听器创建一个与您的问题无关的。但是go http.HandleFunc(“/login”,self.loginHandler)
表明您选择使用go
关键字是任意的,而不是通知的,因为在您的用例中,它并不有用。我建议你不要使用它,除非你确定你真的需要它。谢谢。所以我知道,你能解释一下为什么不需要启动go http.HandleFunc
?如果有,它会造成什么危害?关键字go
会弹出一个新的goroutine,这样关联的函数就可以并发执行,也就是说,当您需要并发时使用它,反之,当不需要并发时,就像讨论中的代码一样,您不使用它。最终没有什么坏处(我知道),你的代码在有关键字和没有关键字的情况下都能正常工作,但是我认为,这是一种糟糕的风格,就像任何用于错误目的的东西一样,如果有的话。
panic: http: multiple registrations for /static/
goroutine 7 [running]:
net/http.(*ServeMux).Handle(0x4da250, 0x2b8830, 0x1, 0x324f68, 0x12183a8)
/usr/local/go/src/net/http/server.go:2403 +0x278
net/http.(*ServeMux).HandleFunc(...)
/usr/local/go/src/net/http/server.go:2440
net/http.HandleFunc(...)
/usr/local/go/src/net/http/server.go:2452
main.(*userStruct).startUI(0x10d6160)