"Mesclar" coloca duas estruturas do mesmo tipo
Olhando para issostruct
:
type Config struct {
path string
id string
key string
addr string
size uint64
}
Agora eu tenho umDefaultConfig
inicializado com alguns valores e um carregado de um arquivo, digamosFileConfig
. Eu quero que ambas as estruturas sejam mescladas para que eu tenha umaConfig
com o conteúdo de ambas as estruturas.FileConfig
deve substituir qualquer coisa definida emDefaultConfig
, enquantoFileConfig
pode não ter todos os campos definidos. (Por que isso? Como um usuário em potencial pode não conhecer o valor padrão, remover a entrada seria equivalente a definir o padrão - eu acho)
Eu pensei que precisaria de reflexão para isso:
func merge(default *Config, file *Config) (*Config) {
b := reflect.ValueOf(default).Elem()
o := reflect.ValueOf(file).Elem()
for i := 0; i < b.NumField(); i++ {
defaultField := b.Field(i)
fileField := o.Field(i)
if defaultField.Interface() != reflect.Zero(fileField.Type()).Interface() {
defaultField.Set(reflect.ValueOf(fileField.Interface()))
}
}
return default
}
Aqui não tenho certeza:
Se for necessária reflexãoPode haver maneiras mais fáceis de fazer issoOutra questão que vejo aqui é que a verificação de valores zero pode ser complicada: e se a estrutura de substituiçãopretende substituir com um valor zero? Felizmente, acho que não se aplica ao meu caso - mas isso se torna uma função, pode se tornar um problema mais tarde