it-swarm.com.de

Wie liest man Eingaben aus der Konsolenzeile?

Ich möchte die Eingabe über die Befehlszeile lesen, aber meine Versuche haben mit dem Beenden des Programms geendet, bevor ich zur Eingabe aufgefordert werde. Ich suche das Äquivalent von Console.ReadLine () in C #. 

Das ist was ich momentan habe:

package main

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

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

    fmt.Println("Enter text: ")
    text2 := ""
    fmt.Scanln(text2)
    fmt.Println(text2)

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

Ich bin nicht sicher, was mit dem Block falsch ist 

reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
fmt.Println(text)

Da funktioniert es auf meiner Maschine. Für den nächsten Block benötigen Sie jedoch einen Zeiger auf die Variablen, denen Sie die Eingabe zuweisen. Versuchen Sie, fmt.Scanln(text2) durch fmt.Scanln(&text2) zu ersetzen. Verwenden Sie nicht Sscanln, da eine Zeichenfolge, die sich bereits im Speicher befindet, statt aus der Standardeingabe analysiert wird. Wenn Sie etwas wie das tun möchten, was Sie versucht haben, ersetzen Sie es durch fmt.Scanf("%s", &ln).

Wenn dies immer noch nicht funktioniert, kann es sich bei Ihrem Täter um seltsame Systemeinstellungen oder eine fehlerhafte IDE handeln.

220
LinearZoetrope

sie können es auch versuchen:

scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
    fmt.Println(scanner.Text())
}

if scanner.Err() != nil {
    // handle error.
}
97
Helin Wang

Ich denke, ein üblicherer Weg, dies zu tun, wäre:

package main

import "fmt"

func main() {
    fmt.Print("Enter text: ")
    var input string
    fmt.Scanln(&input)
    fmt.Print(input)
}

Sehen Sie sich die scan godoc an: http://godoc.org/fmt#Scan

Beim Scannen wird der aus der Standardeingabe gelesene Text gescannt und aufeinanderfolgende, durch Leerzeichen getrennte Werte in aufeinanderfolgenden Argumenten gespeichert. Zeilenumbrüche gelten als Leerzeichen.

Scanln ähnelt dem Scannen, stoppt jedoch das Scannen bei einem Zeilenumbruch und nach dem letzten Objekt muss ein Zeilenumbruch oder EOF vorhanden sein.

73
Pith

Eine andere Möglichkeit, mehrere Eingänge innerhalb einer Schleife zu lesen, die eine Eingabe mit Leerzeichen behandeln können

package main
import (
    "fmt"
    "bufio"
    "os"
)

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    var text string
    for text != "q" {  // break the loop if text == "q"
        fmt.Print("Enter your text: ")
        scanner.Scan()
        text = scanner.Text()
        if text != "q" {
            fmt.Println("Your text was: ", text)
        }
    }
}

Ausgabe:

Enter your text: Hello world!
Your text was:  Hello world!
Enter your text: Go is awesome!
Your text was:  Go is awesome!
Enter your text: q
9
Chiheb Nexus

Versuchen Sie immer, den bufio.NewScanner zum Erfassen von Eingaben von der Konsole zu verwenden. Wie bereits erwähnt, gibt es mehrere Möglichkeiten, den Job zu erledigen, aber der Scanner ist ursprünglich dafür vorgesehen. Dave Cheney erklärt, warum Sie Scanner anstelle von bufio.Reader's ReadLine verwenden sollten.

https://Twitter.com/davecheney/status/604837853344989184?lang=de

Hier ist der Code-Snippet für Ihre Frage

package main

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

/*
 Three ways of taking input
   1. fmt.Scanln(&input)
   2. reader.ReadString()
   3. scanner.Scan()

   Here we recommend using bufio.NewScanner
*/

func main() {
    // To create dynamic array
    arr := make([]string, 0)
    scanner := bufio.NewScanner(os.Stdin)
    for {
        fmt.Print("Enter Text: ")
        // Scans a line from Stdin(Console)
        scanner.Scan()
        // Holds the string that scanned
        text := scanner.Text()
        if len(text) != 0 {
            fmt.Println(text)
            arr = append(arr, text)
        } else {
            break
        }

    }
    // Use collected inputs
    fmt.Println(arr)
}

Wenn Sie die Eingänge nicht programmgesteuert sammeln möchten, fügen Sie einfach diese Zeilen hinzu

   scanner := bufio.NewScanner(os.Stdin)
   scanner.Scan()
   text := scanner.Text()
   fmt.Println(text)

Die Ausgabe des obigen Programms wird sein:

Enter Text: Bob
Bob
Enter Text: Alice
Alice
Enter Text:
[Bob Alice]

Das obige Programm sammelt die Benutzereingaben und speichert sie in einem Array. Wir können diesen Fluss auch mit einem speziellen Charakter unterbrechen. Der Scanner bietet eine API für fortgeschrittene Anwendungen wie das Teilen mit einer benutzerdefinierten Funktion usw., das Scannen verschiedener Arten von E/A-Streams (Stdin, String) usw.

8
Naren Yellavula

Versuchen Sie diesen Code: -

var input string
func main() {
      fmt.Print("Enter Your Name=")
      fmt.Scanf("%s",&input)
      fmt.Println("Hello "+input)
      }
4
SSALPHAX

Ich bin zu spät zur Party. Aber wie wäre es mit einem Liner:

data, err := ioutil.ReadAll(os.Stdin)
3

Lesen Sie einige aufgeforderte Werte sauber ein:

// Create a single reader which can be called multiple times
reader := bufio.NewReader(os.Stdin)
// Prompt and read
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
fmt.Print("Enter More text: ")
text2, _ := reader.ReadString('\n')
// Trim whitespace and print
fmt.Printf("Text1: \"%s\", Text2: \"%s\"\n",
    strings.TrimSpace(text), strings.TrimSpace(text2))

Hier ist ein Lauf:

Enter text: Jim
Enter More text: Susie
Text1: "Jim", Text2: "Susie"
2
Rohanthewiz

Kann auch so gemacht werden: -

package main
import "fmt"     

func main(){
    var myname string
fmt.Scanf("%s", &myname)           
fmt.Println("Hello", myname)       
}
1
Nitin yadav

Sie müssen einen Zeiger auf die zu scannende Variable angeben, z.

fmt.scan(&text2)
0
Liam Mertens