为了账号安全,请及时绑定邮箱和手机立即绑定

使用配置中的值更新字符串数组

使用配置中的值更新字符串数组

Go
慕工程0101907 2023-06-26 15:44:11
我有以下函数,需要在两个选项中提供带有数据的字符串提供了配置中的值(只能更改7MB或 的值3MB)所有前缀都是相同的如果未提供配置,则回退到默认值,7MB 并且3MB例子如果我没有从配置 API 中获取任何值,该函数应该返回默认值,该值是硬编码在函数中的。像这样:“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 []stringvar b1 strings.Builderla:= "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 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

您的程序失败的原因之一是您正在复制不允许的非零strings.Builder实例。

Builder 用于使用 Write 方法有效地构建字符串。它最大限度地减少了内存复制。零值即可使用。不要复制非零构建器。

另外,我在这里可能是错的,但我相信构建器的目的是在处理足够复杂的规则时提供更好的性能,其中使用大量单独的步骤来构建字符串是合理的。然而,您的情况不是其中之一,因为您所需要的只是一个串联即可获得您想要的东西。

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-else,那么您始终可以将该逻辑提取到函数中。


func getCfgProp(key, val, def string) string {

    if len(val) > 0 {

        return key + " " + val

    }

    return key + " " + def

}

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


查看完整回答
反对 回复 2023-06-26
  • 1 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信