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)