#go
# #Вперед
Вопрос:
Я играю с Go. Я хочу сделать так, чтобы, когда кто-то вводил «привет», он печатал hiii
Вот мой код
package main
import (
"fmt"
"bufio"
"os"
)
func main(){
reader := bufio.NewReader(os.Stdin)
fmt.Println("Simple Shell")
fmt.Println("---------------------")
for {
fmt.Print("-> ")
text, _ := reader.ReadString('n')
if (text == "hi") {
fmt.Println("hiii")
}
}
}
Комментарии:
1. В чем ваш вопрос
2. из
ReadString
документации:ReadString reads until the first occurrence of delim in the input, returning a string containing the data up to and including the delimiter.
Ответ №1:
В этом есть хитрость: при использовании функций ReadString и readBytes с разделителем возвращаемая строка (и байты) содержит разделитель. Вот почему условие неверно, ваша фактическая строка — «hi n», а не «hi».
Для чтения из stdin вы можете использовать функцию ReadLine или вручную обрезать символы конечной строки с помощью пакетов strings
и bytes
.
Кроме того, вы можете использовать сканер, он считывает строки по умолчанию. Вот несколько примеров, которые выполняют одну и ту же работу:
package main
import (
"bufio"
"bytes"
"fmt"
"os"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("-> ")
text, _, _ := reader.ReadLine()
if string(text) == "hi" {
fmt.Println("hii")
}
fmt.Print("-> ")
stext, _ := reader.ReadString('n') // stext ends with 'n', it reads the delimiter
stext = strings.TrimRight(stext, "n")
if stext == "hi" {
fmt.Println("hii")
}
fmt.Print("-> ")
text, _ = reader.ReadBytes('n')
text = bytes.TrimRight(text, "n")
if string(text) == "hi" {
fmt.Println("hii")
}
fmt.Print("-> ")
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
stext = scanner.Text()
if stext == "hi" {
fmt.Println("hii")
}
fmt.Print("−> ")
scanner.Scan()
text = scanner.Bytes()
if string(text) == "hi" {
fmt.Println("hii")
}
}
Ответ №2:
Просто добавьте n
такое, чтобы
if text == "hin" {
fmt.Println("hiii")
}