Forgive me, I come from a c# background!
I have following struct in Go. We populate this struct by reading in the config from a file, which works well. However Im trying to find out a way to tell if a particular property in the struct, when passed in through the config file is null. As in, explicitly not set at all.
I've struggled for about 3 hours on this. I can do it for type strings etc, but I can't find out how to do it generically, across all types?
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
}