使用Viper Config动态创建的NET/HTTP进行例程



我有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)
}