gpt4 book ai didi

Golang - 带有许多要 slice 或结构的分隔符的字符串

转载 作者:IT王子 更新时间:2023-10-29 02:15:17 29 4
gpt4 key购买 nike

我从 TCP 连接返回以下字符串作为响应:

220 Connected.\ncommand:connect\nemail:ERROR_MAIL_MISSING\nstatus:CMD_ERROR\nend

我实际上想将此响应转换为以下 golang 结构:

type Message struct {
Key string
Value string
}

type Response struct {
Connect string
Messages []Message
}

如果 220 Connected 始终存在意味着:

Response.Connect => TRUE

220 Connected 之间的所有响应。可以使用 end 访问:

Response[0].Key => "command"
Response[0].Value => "connect"

这是我实际实现的:

result, err := ioutil.ReadAll(conn)
data := strings.Split(string(result), "\n")

for i := range data {
Reply := new(Response)
if data[i] == "220 Connected." {
Reply.Connect = "TRUE"
Response = append(Response, Reply)
}
}

有什么提示可以实现吗?我是 Golang 的新手

最佳答案

您需要做更多的工作来提取所需的数据。下面是一个正确填充 Messages 数组的示例程序。我将更新一些注释,说明我做了什么,以便从您的尝试转变为您正在寻找的内容。

package main

import "fmt"
import "strings"


type Message struct {
Key string
Value string
}

type Response struct {
Connect string
Messages []Message
}
func main() {
result := `220 Connected.\ncommand:connect\nemail:ERROR_MAIL_MISSING\nstatus:CMD_ERROR\nend`
data := strings.Split(string(result), "\\")

r := &Response{}
for i := range data {
if data[i] == "220 Connected." {
r.Connect = "TRUE"
} else {
tokens := strings.Split(data[i], ":")
if len(tokens) == 2 {
m := Message{tokens[0], tokens[1]}
r.Messages = append(r.Messages, m)
}
}
}
for i := range r.Messages {
fmt.Println(r.Messages[i])
}
}

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

好吧,首先让我们列出一些问题。在您的尝试中,for 循环看起来像这样;

  for i := range data {
Reply := new(Response)
if data[i] == "220 Connected." {
Reply.Connect = "TRUE"
Response = append(Response, Reply)
}
}

这与您的类型/数据布局不一致。在每次迭代中,您都会创建一个新的 Response 实例,实际上您只需要一个。您在每次迭代中想要的是一个新的 Message 实例。这会导致一些问题,首先,您正在查看的数据不是响应,而是一条消息,其次,您不断覆盖前一个数据(该对象仅适用于循环)。为了纠正这个问题,我们在循环之前实例化了 Response 对象。其次,您需要进行第二次拆分才能取出数据。所以在循环中,我们用冒号分割来分隔每条消息的键和值。然后我在添加它之前快速检查了长度(我在第一次运行时感到 panic ,第一次运行可能失败了,这意味着你需要稍微编辑一下。如果你没有得到 220 的连接,你想设置它值为 false,您应该将消息拆分为一个 final else 但只是不是 220 Connected. 不足以假设当前项目是 Message 这就是为什么我添加了边界检查)。请注意,在这个循环中,我为每个键值对实例化了一条新消息。我们在那里使用 append 来附加到 Messages 数组,而不是将 Response 附加到彼此上(这永远不会起作用,因为它是一个结构,而不是一个 slice 或映射)。这也使得每次我们到达循环底部时 Message 都会持续存在而不是超出范围(m 将超出范围但 中的实例>r.Messages 仍将存在。

关于Golang - 带有许多要 slice 或结构的分隔符的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34004764/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com