原谅我,我来自ac#背景!
我在Go中有以下结构。我们通过从文件中读取配置来填充此结构,效果很好。但是我试图找出一种方法来告诉结构中的某个特定属性(通过配置文件传递时是否为null)。如图所示,完全没有设置。
我为此奋斗了大约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
}
在执行过程中,值的默认值为其零值。您可能要使所有类型的指针成为指针(例如*string
而不是string
),因为指针的零值为nil
。将配置文件解组到结构中将为丢失/具有空值的键保留nil值。
请注意,由于切片(例如:)[]string
是引用类型,因此它们充当指针并且可以为空(这意味着您无需将类型声明为*[]string
)。
我过去曾使用此库来帮助合并config
/设置所需的键(还有许多其他键):https :
//github.com/jinzhu/configor
JSON编码/解码示例-https:
//play.golang.org/p/DU_5Tuvm5-
问题内容: 我试图找到如何检查是否设置了结构属性,但找不到任何方法。 我期待这样的事情,但实际上这是行不通的: 问题答案: 就像dyoo所说的,如果您的struct属性是指针,则可以使用。如果您想将它们保留为字符串,可以与进行比较。这是一个示例: http://play.golang.org/p/YStKFuekeZ
问题内容: 如何检查seleniumWeb元素是否包含特定的CSS类。 我有这个html li元素 如您所见,在class属性内部有一个活动类。 我的问题是我有这个元素,我想根据class属性是否具有其他“ active”值进行检查,这是比使用xpath更优雅的解决方案。 我怎样才能做到这一点? 问题答案: 鉴于您已经找到了您的元素,并且您想检查class属性内的某个类: 正如@aurelius正
问题内容: 如何检查对象在JavaScript中是否具有特定属性? 考虑: 那是最好的方法吗? 问题答案: 我对所给出的答案感到困惑-他们中的大多数都是完全错误的。当然,您可以拥有具有未定义,空值或假值的对象属性。因此,简单地将属性检查减少到甚至更糟,将给您完全误导的结果。 这取决于您要查找的内容。如果您想知道一个对象是否物理上包含一个属性(并且它不是来自原型链的某个地方),那么您就可以这样做。所
我有如下注释的类: 从这个意义上说,我希望标识类并为它们创建对象,并将它们放在的一般中。 我如何使用反射和Java来做到这一点?
请看do while循环,我认为注释是不言自明的。我想检查该集合是否设置了所有具有符号a、b、c、d的卡片(借助数组或其他任何东西实现它)。
问题内容: 我正在使用反射来查看附加到类的属性的注释是否具有特定类型。目前我正在做: 这让我有些不高兴,因为它依赖于完全合格的类名称的字符串。如果将来更改命名空间,则可能会导致细微的错误。 我想要做: 但是是抽象类,无法实例化。有没有一种方法可以针对接口或抽象类进行模拟(或基本上使用)? 问题答案: 你只是在寻找 ?