【问题标题】:From String to Struct Golang从字符串到结构 Golang
【发布时间】:2019-01-14 09:19:38
【问题描述】:

我创建了一个函数来将特定的字符串(派生自 [] 字节)转换为结构。在我正在构建的程序中执行加密和解密,并且在这两个通道之间,数据通过 JSON 传输。我建议的功能有效,但是当字符串变得很长时,处理时间很长。 我想问的是是否有人知道如何加快此功能或如何更好地管理这种情况。

这是函数

func Datadecrypt(input []byte) Data {

    s := string(input)

    vals := strings.Replace(s,"  "," ",-1)

    part := strings.Fields(vals)

    c := strings.Split(s, "int=")[1]
    co := strings.Split(c, ")")[0]

    count, err := strconv.Atoi(co)
    if err != nil {
        log.Fatal(err)
    }

    var stringa string

    for j := 0; j<len(part); j++ {
        if strings.ContainsAny(part[j], ":") {
            stringa = stringa+" "+part[j]
        } else {
            stringa = stringa+","+part[j]
        }
    }

    var interpart []map[string]string
    var result Data

    var i = 0

    for {

        split := strings.Split(stringa, "[")[2+i]

        splitend := strings.Split(split, "]")[0]

        control := strings.Replace(splitend,"  "," ",-1)

        mapst := mapstring.StrToMS(control)

        interpart = append(interpart, mapst)

        i++

        if i >= count {
            break
        }
    }

    result = Data{Count: count, Results: interpart}

    return result
}

这是结构

type Data struct {
    Count int `json:"count"`
    Results []map[string]string `json:"result"`
}

这是从 s 派生的字符串:= string (input)

"Count=\"%!s(int=107)\"\nResults=\"[map[MATRICOLA:2 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:7 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:5 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:6 NOMEmy:value COGNOMEmy:value]]\"\n"

我上面写的字符串是使用 JSON 响应打印出来的

这是输入字符串,不是 JSON

Count="%!s(int=107)"
Results="[map[MATRICOLA:2 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:7 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:5 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:6 NOMEmy:value COGNOMEmy:value]]"

这是我通过函数得到的结果

{107 map[MATRICOLA:2 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:7 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:5 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:6 NOMEmy:value COGNOMEmy:value]]}

谢谢,提前

【问题讨论】:

  • 不要转成字符串,保留字节切片,所有功能都可用golang.org/pkg/bytes
  • 您正在做的是将字节转换为字符串,然后处理字符串以获取值是完全没有必要的。
  • 写一个基准测试并使用 pprof 找出慢的地方。
  • 字符串来自http请求,但响应是加密的。它由 ioutil.ReadAll 读取,然后使用我创建的解密函数解密,所有结果是 Datadecrypt() 中输入的 []byte。
  • 正如@Volker 所指出的,您必须进行测量以找出慢的地方,尝试优化,并测量是否更快。这就是优化代码的方法。请记住,尽管大密文的加密/解密无论如何都需要时间(这在某种程度上是加密的重点),所以它的运行速度会有一定的限制。

标签: string performance function go


【解决方案1】:

这不是您问题的答案,而是您问题的解决方案。如果我完全错了,请发表评论。

输入字符串看起来像是通过fmt.Printf()生成的

"Count=\"%!s(int=107)\"\nResults=\"[map[MATRICOLA:2 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:7 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:5 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:6 NOMEmy:value COGNOMEmy:value]]\"\n"

https://play.golang.org/p/pRWUtRKikEh

    count := 107
    results := "[map[MATRICOLA:2 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:7 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:5 NOMEmy:value COGNOMEmy:value] map[MATRICOLA:6 NOMEmy:value COGNOMEmy:value]]"

    fmt.Printf("Count=%s\nResults=%s", count, results)

因此,如果您能够将打印语句更改为fmt.Printf("Count=%d\nResults=%s", count, results),则输出将是正确的。 https://play.golang.org/p/g45_TiHMFsG

【讨论】:

  • 感谢您的回复,但我认为您没有理解我的目标。我希望您作为字符串打印的内容最终出现在 Data 结构中,因此不考虑计数,我希望将在 Result 之后打印的部分转换为 map[string]string。
  • @bed 不会直接解析成map[string]string,你应该将字符串转换回json并解组数据。
  • 我试过这样:split := strings.Split(vals, "\"")[1] splitend := strings.Split(split, "\"")[0] var ciao []map[string]string json.Unmarshal([]byte(splitend), &amp;ciao) result := jsonmerge.Data{Count: count, Results: ciao} 但不行,我有字符串,但地图没有填满……你能给我举个例子吗?
  • 我认为拆分不是一个好主意,因为这会导致性能问题。您应该覆盖字符串的每个字符。我仍然认为您在这里做的工作太多,因为错误在您的功能之前。因为你在这里做的是解析一些不正确的东西。
猜你喜欢
  • 2022-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 2021-11-15
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多