Обновить массив строк значением из config - PullRequest
2 голосов
/ 15 июня 2019

У меня есть следующая функция, которая должна предоставлять строки с данными в двух вариантах

  1. Предоставлено значение из конфигурации (можно изменять только значения 7MB или 3MB) всепрефикс тот же
  2. Если в конфигурации не предоставлен откат к значениям по умолчанию, которые 7MB и 3MB

пример

, если я не получу никакого значения отAPI config функция должна возвращать значения по умолчанию , что жестко задано в функции.например:

“l_sh_dit conf_data 7MB
 l_sh_dit cert_data 3MB”

если я получаю значение из приложения config, скажем, 1MB (conf) и 100MB (cert) соответственно, вывод функции должен выглядеть как l

“l_sh_dit conf_data 1MB
 l_sh_dit cert_data 100MB”

Проблема в том, что у меня уже есть defaults значение hard-coded, как я могу эффективно обновить в каждом element в массиве только последнее значение (число 10M или все другие значения)?

Я пытался с API строителя строк безуспешно, так как это немного сложно, что здесь может быть не так?

func getShCfg() string{

var out []string

var b1 strings.Builder


la:= "l_sh_dit conf_data 7MB"
lb := "l_sh_dit cert_data 3MB"

cfg, ok := c.(config.Configuration)

if !ok {
    log.Errorf(“error:”, c)
    return ""
}

// here I got the data from config, else fallback to defaults 
if len(cfg.A) > 0 {

   // HERE is my problem which doesn’t works
   b1.WriteString("l_sh_dit")
   b2 := b1
   b2.WriteString("conf_data") 
   b3 := b2
   b3.WriteString(cfg.A) 

   out = append(out, b3)
} else {
    out = append(out, la)
}


// here I got the data from config, else fallback to defaults 
if len(cfg.B) > 0 {
   // HERE is my problem which doesn’t works
   b1.WriteString("l_sh_dit")
   b2 := b1
   b2.WriteString("cert_data") 
   b3 := b2
   b3.WriteString(cfg.B) 
   out = append(out, b3)

} else {
    out = append(out, lb)
}

return strings.Join(out, ";\n\r") + ";"

}

1 Ответ

2 голосов
/ 15 июня 2019

Одна из причин сбоя вашей программы в том, что вы копируете ненулевой экземпляр strings.Builder, который запрещен.

Для эффективной сборки используется Builderстрока с использованием методов записи.Это минимизирует копирование памяти.Нулевое значение готово к использованию. Не копируйте ненулевой Builder.

Кроме того, и я могу ошибаться, но я считаю, что конструктор предназначен для обеспечения лучшей производительности при работе с достаточно сложнымправила, в которых использование множества отдельных шагов для построения строки оправдано.Однако, это не один из этих случаев, потому что все, что вам нужно, это единственная конкатенация, чтобы получить то, что вы хотите.

type Cfg struct { A, B string }

func getShCfg(c Cfg) string {
    var out []string

    la := "l_sh_dit conf_data 7MB"
    lb := "l_sh_dit cert_data 3MB"

    if len(c.A) > 0 {
        out = append(out, "l_sh_dit conf_data " + c.A)
    } else {
        out = append(out, la)
    }
    if len(c.B) > 0 {
        out = append(out, "l_sh_dit cert_data "+c.B)

    } else {
        out = append(out, lb)
    }

    return strings.Join(out, ";\n\r") + ";"

}

https://play.golang.com/p/WKMXxCXGuTt


Дополнительно, если числосвойства конфига растут, и вы не хотите писать слишком много if-elses, тогда вы всегда можете извлечь эту логику в функцию.

func getCfgProp(key, val, def string) string {
    if len(val) > 0 {
        return key + " " + val
    }
    return key + " " + def
}

https://play.golang.com/p/daXqV4-Umza

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...