Golang-包含许多分隔符的字符串,用于切片或结构

Golang-包含许多分隔符的字符串,用于切片或结构,go,Go,以下字符串作为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 }

以下字符串作为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连接始终存在,则表示:

Response.Connect => TRUE
220之间的所有响应均已连接。可通过以下方式访问终端:

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的新手

你需要做更多的工作来提取你想要的数据。下面是一个正确填充
消息
数组的示例程序。我会更新一些笔记,告诉你我做了些什么,从你的尝试变成了你想要的

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])
        }
}

好的,首先让我们列出一些问题。在您的尝试中,for循环如下所示

  for i := range data {
            Reply := new(Response)
            if data[i] == "220 Connected." {
                    Reply.Connect = "TRUE"
                    Response = append(Response, Reply)
            }
    }
这与您的类型/数据布局不一致。在每次迭代中创建一个新的
响应
实例,实际上只需要一个。每次迭代都需要一个新的
消息
实例。这会导致一些问题,首先,您查看的数据不是响应,而是消息,其次,您会不断覆盖上一个数据(该对象仅适用于循环)。为了纠正这个问题,我们在循环之前实例化
响应
对象。其次,您需要进行第二次拆分,以获取数据。因此,在循环内部,我们在冒号上拆分,以分离每条消息的键和值。然后在添加之前,我会快速检查长度(我在第一次运行时感到恐慌,第一次运行可能失败,这意味着您需要对其进行编辑。如果您没有获得220 for connected的值,您希望将该值设置为false,则您应该执行消息拆分和最终的else,但只是没有连接到
220。
不足以假设当前项是
消息,这就是我的原因。)添加了边界检查)。请注意,在这个循环中,我为每个键值对实例化了一条新消息。我们使用append there将
消息
数组追加,而不是将
响应
追加到彼此上(这永远不会起作用,因为它是一个结构,而不是一个切片或映射)。这也使得
消息
在每次到达循环底部时都会持续存在,而不是超出范围(
m
将超出范围,但
r.Messages中的实例仍然存在)