2016-09-23 5 views
1

Dies ist der Befehl, den ich ausführenArray von Strings zu gehen struct

$ ps -e 
    PID PPID PGID  WINPID TTY   UID STIME COMMAND 
4372  1 4372  4372 ?   197608 03:44:57 /usr/bin/mintty 
6476 4372 6476  6208 pty0  197608 03:44:58 /usr/bin/bash 
14484 6476 14484  12888 pty0  197608 13:23:48 /usr/bin/ps 

I 1d Array von Strings mit bufio scanner.scanLines bekommen. Ich muss dies in Array von Strukturen konvertieren:

type ProcessInfo struct { 
    PID string `json:"PID"` 
    PPID string `json:"PPID"` 
    PGID string `json:"PGID"` 
    WINPID string `json:"WINPID"` 
    TTY string `json:"TTY"` 
    UID string `json:"UID"` 
    STIME string `json:"STIME"` 
    COMMAND string `json:"COMMAND"` 
} 

Jede Hilfe wäre willkommen.

+0

Meinst du "konvertieren dies in Array von Strukturen"? Da die von Ihnen bereitgestellte Struktur nur eine Ausgabezeile enthalten kann. – divan

+0

@divan Ja, Sie haben Recht.Ich meinte Array von ProcessInfo-Strukturen. – jojo

Antwort

3

Es gibt eine handliche strings.Fields Funktion in strings Paket, das hilft, diese Art von Ausgabe zu analysieren. Go mag pragmatische Ansätze, so dass die naive Implementierung wäre:

  • Iterierte über den Array und teilte jede Zeile in Felder mit Leerzeichen als Trennzeichen
  • neues Objekt aus diesen Bereichen Process konstruieren
  • hinzufügen, um dieses Objekt zu dem Array

Annahme, daß Ihr Array lines genannt, nur so etwas tun:

var pinfos []ProcessInfo 
for _, line := range lines { 
    fields := strings.Fields(line) 

    pi := ProcessInfo{ 
     PID:  fields[0], 
     PPID: fields[1], 
     PGID: fields[2], 
     WINPID: fields[3], 
     TTY:  fields[4], 
     UID:  fields[5], 
     STIME: fields[6], 
     COMMAND: fields[7], 
    } 

    pinfos = append(pinfos, pi) 
} 

Sehen Sie den ganzen Code hier: https://play.golang.org/p/wo8FFiYabA

+0

Der folgende Code reicht für jeden Befehl, den wir ausführen, wie "ps", "ps -e" oder "ps -f" https://play.golang.org/p/G8tDioZkf9 – jojo