399 Stimmen

Wie kann ich von der Standardeingabe in der Konsole lesen?

Ich möchte Eingaben aus der Befehlszeile lesen, aber meine Versuche endeten damit, dass das Programm beendet wird, bevor ich zur Eingabe aufgefordert werde. Ich bin auf der Suche nach dem Äquivalent von Console.ReadLine() in C#.

Das ist mein aktueller Code:

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Text eingeben: ")
    text, _ := reader.ReadString('\n')
    fmt.Println(text)

    fmt.Println("Text eingeben: ")
    text2 := ""
    fmt.Scanln(text2)
    fmt.Println(text2)

    ln := ""
    fmt.Sscanln("%v", ln)
    fmt.Println(ln)
}

3voto

R Sun Punkte 1113

In meinem Fall wartete das Programm nicht, weil ich den watcher-Befehl verwendet habe, um das Programm automatisch auszuführen. Das manuelle Ausführen des Programms go run main.go führte zu "Text eingeben" und letztendlich zum Drucken in die Konsole.

fmt.Print("Text eingeben: ")
var input string
fmt.Scanln(&input)
fmt.Print(input)

0voto

Lass es uns ganz einfach machen

s:=""
b := make([]byte, 1)
for os.Stdin.Read(b) ; b[0]!='\n'; os.Stdin.Read(b) {
    s+=string(b)
}
fmt.Println(s)

0voto

Kemal Punkte 2512

Hier ist der richtige Weg, um mehr als 1024 Zeichen vom Terminal zu lesen. So wie es ist, funktioniert es nicht mit Pipes und Fehler, Sie können auch wählen, auf andere Methoden zurückzugreifen (z.B. Lesen mit bufio.Scanner oder io.ReadAll) in diesem Fall.

paket main

import (
    "fmt"
    "os"

    "golang.org/x/term"
)

func readLine() (string, error) {
    if !term.IsTerminal(int(os.Stdin.Fd())) {
        return "", fmt.Errorf("Pipe wird nicht unterstützt")
    }

    oldState, err := term.MakeRaw(int(os.Stdin.Fd()))
    if err != nil {
        return "", fmt.Errorf("Fehler beim Setzen von stdin auf den Rohmodus: %w", err)
    }
    tty := term.NewTerminal(os.Stdin, "")
    line, err := tty.ReadLine()
    _ = term.Restore(int(os.Stdin.Fd()), oldState)

    if err != nil {
        return "", fmt.Errorf("Fehler beim Lesen von stdin: %w", err)
    }
    return line, nil
}

func main() {
    fmt.Println("Geben Sie Ihre Zeile ein:")
    zeile, err := readLine()
    if err != nil {
        panic(err)
    }
    fmt.Printf("Ihre Zeile hatte %d Zeichen: %q\n", len(zeile), zeile)
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X