原谅我,我来自c#背景!
我在Go中有以下结构。我们通过从文件中读取配置来填充此结构,该文件运行良好。但是我试图找出一种方法来判断结构中的特定属性是否在通过配置文件传入时为空。如同,明确没有设置。
我已经挣扎了大约3个小时。我可以为类型字符串等做这些,但我无法在所有类型中找到如何一般地做到这一点?
package main
import (
"encoding/json"
"fmt"
"os"
"reflect"
)
// Config type for configuration
type Config struct {
BatchSize int `json:"batchSize"`
BatchTime int `json:"batchTime"`
DataFolder string `json:"dataFolder"`
TempFolder string `json:"tempFolder"`
//Kafka configuration
Brokers []string `json:"streamBrokers"`
TopicJoined string `json:"streamTopicJoined"`
TopicRemoved string `json:"streamTopicRemoved"`
Group string `json:"streamGroup"`
ClientName string `json:"streamClientName"`
// Stats configuration
StatsPrefix string `json:"statsPrefix"`
//AWS S3 configuration
AccessKey string `json:"amazonAccessKey"`
SecretKey string `json:"amazonSecretKey"`
Region string `json:"amazonRegion"`
Endpoint string `json:"amazonEndpoint"`
S3Bucket string `json:"amazonS3Bucket"`
S3UploadBufferSize int32 `json:"amazonS3UploadBufferSize"`
S3UploadConcurrentSize int32 `json:"amazonS3UploadConcurrentSize"`
S3UploadRetries int32 `json:"amazonS3UploadRetries"`
S3UploadRetryTime int32 `json:"amazonS3UploadRetryTime"`
//Logging
StatsdHost string `json:"statsdHost"`
StatsdPort int `json:"statsdPort"`
StatsdRate float64 `json:"statsdRate"`
//Test Publishing
TestMode bool `json:"testMode"`
TestCount int `json:"testCount"`
}
// LoadConfig load config from file
func LoadConfig(configFile string) *Config {
if _, err := os.Stat(configFile); os.IsNotExist(err) {
panic(err)
}
if config, err := loadFromFile(configFile); nil != err {
panic(err)
} else {
fmt.Println("OneDrive", os.Getenv("OneDrive"))
msValuePtr := reflect.ValueOf(config)
msValue := msValuePtr.Elem()
typeOfT := msValue.Type()
for i := 0; i < msValue.NumField(); i++ {
field := msValue.Field(i)
// TODO: Check if field is null, regardless of type and the value from OS env variables...
}
return config
}
}
func loadFromFile(path string) (*Config, error) {
var config Config
file, err := os.Open(path)
if err != nil {
return nil, fmt.Errorf("could not open config path %q: %v", path, err)
}
defer file.Close()
decoder := json.NewDecoder(file)
err = decoder.Decode(&config)
if err != nil {
return nil, fmt.Errorf("could not parse config path %q: %v", path, err)
}
return &config, nil
}
答案 0 :(得分:3)
在go中,值的默认值为zero value。您可能希望生成所有类型指针(例如:*string
而不是string
),因为指针的零值为nil
。将配置文件解组为结构将保留缺少/具有空值的键的nil值。
请注意,由于切片(例如:[]string
)是引用类型,它们充当指针并且可以为空(意味着您不需要将类型声明为*[]string
)。
我过去曾使用过这个库来帮助合并配置/设置所需的密钥(以及其他许多密钥存在): https://github.com/jinzhu/configor
编码/解码json的示例 - https://play.golang.org/p/DU_5Tuvm5-