2016-04-29 21 views
1

Ich habe ein wenig funky Thema in Golang. Im Wesentlichen habe ich eine Reihe von Strings, die Dateipfade darstellen. Ich habe dann eine Katze gegen diese Dateipfade laufen, um die Dateien zu kombinieren, vor dem Sortieren, deduping usw.Golang - warum ist String Element nicht in exec cat enthalten, es sei denn ich sortiere es

hier ist der Abschnitt des Codes (wobei ‚applicableReductions‘ ist der String Scheibe):

applicableReductions := []string{} 

    for _, fqFromListName := range fqFromListNames { 
     filePath := GetFilePath() 
     //BROKE CODE GOES HERE 
    } 
    applicableReductions = append(applicableReductions, filePath) 

    fileOut, err := os.Create(toListWriteTmpFilePath) 
    if err != nil { 
     return err 
    } 
    cat := exec.Command("cat", applicableReductions...) 
    catStdOut, err := cat.StdoutPipe() 
    if err != nil { 
     return err 
    } 
    go func(cat *exec.Cmd) error { 
     if err := cat.Start(); err != nil { 
      return fmt.Errorf("File reduction error (cat) : %s", err) 
     } 
     return nil 
    }(cat) 

    // Init Writer & write file 
    writer := bufio.NewWriter(fileOut) 
    defer writer.Flush() 

    _, err = io.Copy(writer, catStdOut) 
    if err != nil { 
     return err 
    } 

    if err = cat.Wait(); err != nil { 
     return err 
    } 

    fDiff.StandardiseData(fileOut, toListUpdateFolderPath, list.Name) 

Die oben genannten Arbeiten fein. Das Problem tritt auf, wenn ich versuche, ein neues Ele an das Array anzuhängen. Ich habe eine seperate Funktion, die eine neue Datei aus db-Inhalt erstellt, die dann zu dem anwendbaren Reductions-Slice hinzugefügt wird.

func RetrieveDomainsFromDB(collection *Collection, listName, outputPath string) error { 
    domains, err := domainReviews.GetDomainsForList(listName) 
    if err != nil { 
     return err 
    } 

    if len(domains) < 1 { 
     return ErrNoDomainReviewsForList 
    } 

    fh, err := os.OpenFile(outputPath, os.O_RDWR, 0774) 
    if err != nil { 
     fh, err = os.Create(outputPath) 
     if err != nil { 
      return err 
     } 
    } 
    defer fh.Close() 
    _, err = fh.WriteString(strings.Join(domains, "\n")) 
    if err != nil { 
     return err 
    } 

    return nil 
} 

Wenn ich die obige Funktion und fügen Sie den filePath an die applicableReduction Scheibe nennen, ist es dort aber tut von Katze aufgerufen.

Um zu klären, wenn ich die setzte folgend, wo es BROKE CODE GOES HERE sagt:

if dbSource { 
     err = r.RetrieveDomainsFromDB(collection, ToListName, filePath) 
     if err != nil { 
       return err 
       continue 
      } 
     } 

Die Filepath gesehen werden kann, wenn fmt.Println(applicableReductions) aber der Inhalt der Dateien Inhalt in der Katze Ausgabedatei zu sehen ist nicht zu tun .

Ich dachte vielleicht eine Verzögerung in der Datei wird geschrieben, so dass ich versuchte, eine Zeit hinzuzufügen. Warten, tis hat nicht geholfen. Allerdings ist die Lösung, die ich zu sortieren war, um die Scheibe zu finden, zum Beispiel dieses Code über den Aufruf Katze exec löst das Problem, aber ich weiß nicht, warum:

sort.Strings(applicableReductions) 

ich bestätigt habe alle Dateien, die auf erfolgreiche und unsucessful laufen die einzigen Unterschied ist ohne die Art, der Inhalt der endgültigen angehängten Datei fehlt

Eine Erklärung von einem Go-Pro da draußen wäre sehr geschätzt, lassen Sie mich wissen, wenn Sie weitere Informationen benötigen, debuggen - gerne zu verpflichten, zu verstehen

UPDATE I Es wurde vorgeschlagen, dass dies das gleiche Problem ist wie hier: Golang append an item to a slice, ich glaube, ich verstehe das Problem dort und ich sage nicht, dass dies nicht das gleiche ist, aber ich kann nicht das gleiche passieren sehen - das fragliche Stück wird nicht von außen berührt die Hauptfunktion (z keine Bearbeitung der Scheibe in RetrieveDomainsFromDB Funktion), ich die Scheibe vor einer Schleife erstellen, an sie innerhalb einer Schleife anhängen und dann nach der Schleife - ich habe ein Beispiel an der Spitze hinzugefügt, um zu zeigen, wie die Scheibe gebaut wird - bitte könnte jemand klären, wo diese Scheibe kopiert werden, wenn dies der Fall ist

+0

Mögliche Duplikat [Golang zu einer Scheibe ein Element anhängen] (http://stackoverflow.com/questions/20195296/golang-append-an-item-to-a-slice) –

+0

Sortierung wird das Problem auch nicht lösen.Vielleicht haben Sie Glück, dass einige der Elemente (wegen der Sortierung) vor dem darunter liegenden Array des Slices verschoben werden und die Dateien daher verarbeitet werden. Das Slice, das an die Go-Routine übergeben wird, hat die gleiche Länge, Startposition in dem zugrundeliegenden Array usw., unabhängig davon, was von einigen anderen Funktionen an es angehängt wird. –

+0

Hier ist ein Beispiel für das Verhalten von Slices https://play.golang.org/p/kZGovImZDm .... Möglicherweise sollten Sie die neuen Dateipfade über einen Kanal an die Goroutine übergeben. –

Antwort

0

UPDATE UND sCHLIESSEN Bitte schließen Frage - die Frage der Verwendung eines String-Scheibe ohne Bezug war. Stellt sich heraus, dass ich aus der endgültigen Ausgabedatei vor Bufio-Schreiber wurde geleert wurde (am Ende der Funktion vor verzögern Flush trat in Funktion zurück)

Ich denke, die Sortierung war nur Neuordnung des Problems, so dass ich nicht Beachten Sie, dass es bestehen bleibt, oder geben Sie dem Puffer möglicherweise etwas Zeit zum Spülen. In beiden Fällen jetzt mit einem manuellen Anruf zum Spülen sortiert.

Vielen Dank für alle Hilfe zur Verfügung gestellt