Если заявления с Go

#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")
}