[go] 콘솔의 표준 입력에서 읽는 방법은 무엇입니까?

명령 줄에서 표준 입력을 읽으려고하지만 입력하라는 메시지가 표시되기 전에 프로그램이 종료되면서 시도가 끝났습니다. C #에서 Console.ReadLine () 에 해당하는 것을 찾고 있습니다.

이것이 내가 현재 가지고있는 것입니다 :

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



답변

블록에 어떤 문제가 있는지 잘 모르겠습니다

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

내 컴퓨터에서 작동합니다. 그러나 다음 블록의 경우 입력을 할당 할 변수에 대한 포인터가 필요합니다. 교체 시도 fmt.Scanln(text2)와 함께 fmt.Scanln(&text2). Sscanlnstdin 대신 메모리에 이미있는 문자열을 구문 분석하기 때문에을 사용하지 마십시오 . 당신이하려고했던 것과 같은 것을하고 싶다면, 그것을fmt.Scanf("%s", &ln)

그래도 문제가 해결되지 않으면 이상한 시스템 설정이나 버그가있는 IDE 일 수 있습니다.


답변

당신은뿐만 아니라 시도 할 수 있습니다 :

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

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


답변

이 작업을 수행하는보다 표준적인 방법은 다음과 같습니다.

package main

import "fmt"

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

상기 살펴보세요 scangodoc을 : http://godoc.org/fmt#Scan

스캔은 표준 입력에서 읽은 텍스트를 스캔하여 연속 공백으로 구분 된 값을 연속 인수에 저장합니다. 줄 바꿈은 공백으로 계산됩니다.

Scanln은 스캔과 비슷하지만 줄 바꿈에서 스캔을 중지하며 마지막 항목 뒤에 줄 바꿈 또는 EOF가 있어야합니다.


답변

콘솔에서 입력을 수집 할 때는 항상 bufio.NewScanner 를 사용하십시오 . 다른 사람들이 언급했듯이 여러 가지 방법으로 작업을 수행 할 수 있지만 스캐너는 원래 작업을 수행하도록되어 있습니다. Dave Cheney는 bufio.Reader의 ReadLine 대신 스캐너를 사용해야하는 이유를 설명합니다.

https://twitter.com/davecheney/status/604837853344989184?lang=en

다음은 귀하의 질문에 대한 코드 스 니펫 답변입니다

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

프로그래밍 방식으로 입력을 수집하지 않으려면 다음 행을 추가하십시오.

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

위 프로그램의 출력은 다음과 같습니다.

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

위의 프로그램은 사용자 입력을 수집하여 배열에 저장합니다. 우리는 또한 특별한 흐름으로 그 흐름을 깨뜨릴 수 있습니다. 스캐너는 사용자 정의 기능 등을 사용한 분할, 다양한 유형의 I / O 스트림 (Stdin, String) 스캔 등 고급 사용을위한 API를 제공합니다.


답변

공백이있는 입력을 처리 할 수있는 루프 내에서 여러 입력을 읽는 또 다른 방법 :

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

산출:

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


답변

나는 파티에 늦었다. 그러나 하나의 라이너는 어떻습니까?

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

명령 행에 입력이 입력되면 ctrl + d (EOT)를 누르십시오.


답변

이 코드를 사용해보십시오 :-

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