2015-11-30 51 views
1

我有以下字符串返回從TCP連接響應:Golang - 字符串與許多分隔符切片或結構

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 CONNEC之間的所有響應特德。

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

回答

1

你需要做更多的工作來提取你想要的數據。以下是一個正確填充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。其次,你需要第二次拆分才能獲取數據。因此,在循環內部,我們在冒號上分隔每個消息的密鑰和值。然後我在添加它之前快速檢查一下這個長度(我在第一次運行時遇到了一個恐慌,如果可能失敗了,這意味着你需要編輯一下,如果你沒有得到220的連接,你想設置價值假,你應該做的消息分裂一個最後的其他人,但根本不是220 Connected.是不足以承擔當前項目是Message這就是爲什麼我加入了邊界檢查)。請注意,在此循環中,我爲每個鍵值對實例化一條新消息。我們使用追加附加到Messages數組,而不是追加Response的彼此(這將永遠不會工作,因爲它是一個結構,而不是片或地圖)。這也使得Message在每次我們觸及循環底部時都會持續存在,而不是超出範圍(m將超出範圍,但r.Messages中的實例仍然存在)。