我有Viper在config.yml&中提供以下值。在此处附加了其余的配置:
servers:
- projectname: test
directory: D:playgroudtest
port: 1029
- projectname: test1
directory: D:playgroundtest1
port: 1030
coniguration.go包含
package config
import ()
type Configuration struct {
Servers []ServerConfiguration
}
package main
import (
"config"
"github.com/spf13/viper"
"log"
"net/http"
)
server.go
package config
type ServerConfiguration struct {
ProjectName string
Directory string
Port string
}
main.go
func main() {
viper.SetConfigName("config")
viper.AddConfigPath(".")
var configuration config.Configuration
if err := viper.ReadInConfig(); err != nil {
log.Fatalf("Error reading config file, %s", err)
}
err := viper.Unmarshal(&configuration)
if err != nil {
log.Fatalf("unable to decode into struct, %v", err)
}
counter := 0
finish := make(chan bool)
for _, h := range configuration.Servers {
counter = counter +1
log.Println(counter)
counter := http.NewServeMux()
counter.HandleFunc("/"+h.ProjectName, foo8001 )
go func() {
http.ListenAndServe(":"+h.Port, counter)
}()
}
<-finish
}
func foo8001(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Listening on 8001: foo "))
}
但是,当我运行服务器时,我只看到1030和1029的服务似乎已经结束。
这是输出:
2018/02/25 03:53:30 1
2018/02/25 03:53:30 2
我在这里做错了什么,感谢任何能更好地理解它的见解,也将感谢任何思想或建议。
预先感谢!
这可能是因为您的端口在启动最安全的方法之前正在循环变化,这是将参数传递给Goroutine并将所有呼叫转移到h
参数到Goroutine。这样的事情应该起作用
for _, h := range configuration.Servers {
counter = counter + 1
log.Println(counter)
go func(h ServerConfiguration) {
server := http.NewServeMux()
server.HandleFunc("/"+h.ProjectName, foo8001)
http.ListenAndServe(":"+h.Port, server)
}(h)
}