J'aimerais lire les entrées à partir de la ligne de commande, mais mes tentatives se sont terminées avec la fermeture du programme avant que je ne sois invité à le faire. Je cherche l'équivalent de Console.ReadLine () en C #.
C'est ce que j'ai actuellement:
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)
}
Je ne sais pas ce qui ne va pas avec le bloc
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
fmt.Println(text)
Comme cela fonctionne sur ma machine. Cependant, pour le bloc suivant, vous avez besoin d'un pointeur sur les variables auxquelles vous affectez l'entrée. Essayez de remplacer fmt.Scanln(text2)
par fmt.Scanln(&text2)
. N'utilisez pas Sscanln
, car il analyse une chaîne déjà en mémoire au lieu de stdin. Si vous voulez faire quelque chose comme ce que vous essayiez de faire, remplacez-le par fmt.Scanf("%s", &ln)
Si cela ne fonctionne toujours pas, votre coupable peut être des paramètres système étranges ou un IDE buggy.
vous pouvez aussi bien essayer:
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if scanner.Err() != nil {
// handle error.
}
Je pense qu'un moyen plus standard de faire cela serait:
package main
import "fmt"
func main() {
fmt.Print("Enter text: ")
var input string
fmt.Scanln(&input)
fmt.Print(input)
}
Jetez un coup d’œil à la scan
godoc: http://godoc.org/fmt#Scan
Balayer analyse le texte lu à partir de l'entrée standard, en stockant des valeurs successives séparées par des espaces dans des arguments successifs. Les nouvelles lignes comptent comme un espace.
Scanln est similaire à Scan, mais arrête la numérisation sur une nouvelle ligne et, après le dernier élément, il doit y avoir une nouvelle ligne ou un EOF.
Une autre façon de lire plusieurs entrées dans une boucle pouvant gérer une entrée avec des espaces:
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)
}
}
}
Sortie:
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
Essayez toujours d'utiliser bufio.NewScanner pour collecter les entrées à partir de la console. Comme d'autres l'ont mentionné, il existe plusieurs façons d'effectuer le travail, mais Scanner est initialement conçu pour le faire. Dave Cheney explique pourquoi vous devriez utiliser Scanner au lieu de ReadLine de bufio.Reader.
https://Twitter.com/davecheney/status/604837853344989184?lang=fr
Voici l'extrait de code qui répond à votre question
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)
}
Si vous ne voulez pas collecter les entrées par programme, ajoutez simplement ces lignes
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
text := scanner.Text()
fmt.Println(text)
Le résultat du programme ci-dessus sera:
Enter Text: Bob
Bob
Enter Text: Alice
Alice
Enter Text:
[Bob Alice]
Le programme ci-dessus collecte les entrées utilisateur et les enregistre dans un tableau. Nous pouvons également briser ce flux avec un caractère spécial. Scanner fournit une API pour une utilisation avancée, telle que le fractionnement à l'aide d'une fonction personnalisée, l'analyse de différents types de flux d'E/S (Stdin, String), etc.
Essayez ce code: -
var input string
func main() {
fmt.Print("Enter Your Name=")
fmt.Scanf("%s",&input)
fmt.Println("Hello "+input)
}
Je suis en retard à la fête. Mais qu'en est-il d'un paquebot:
data, err := ioutil.ReadAll(os.Stdin)
Lire proprement dans un couple valeurs invitées:
// 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))
Voici une course:
Enter text: Jim
Enter More text: Susie
Text1: "Jim", Text2: "Susie"
Peut aussi être fait comme ça: -
package main
import "fmt"
func main(){
var myname string
fmt.Scanf("%s", &myname)
fmt.Println("Hello", myname)
}
Vous devez fournir un pointeur sur la variable à analyser, comme suit:
fmt.scan(&text2)