반응형

Golang : 키보드 입력받기

 

console창에서 작업을 하는 프로그램을 만들다보면 가끔 키보드 입력을 받아야 할 때가 있습니다. 단순하다면 단순할 수 있는데, 파이썬 등에 익숙해져 있다보니 조금은 낮설긴 합니다.

예제에서 가져오는 패키지 목록은 다음과 같습니다.

  • bufio : Buffered I/O로 인출력 인터페이스 제공
  • os : 패키지 내에 standard input을 제공
  • strings : 입력받은 문자열에서 필요없는 줄바꿈이라든지 앞뒤공백을 제거하기 위해 TrimSpace 이용
  • strconv : 문자열을 정수, 실수 등으로 변환
  • fmt : 출력을 한다면..
  • log : 에러 출력하기 위해..

 

키보드로부터 문자열 입력받기

package main

import (
	"bufio"
	"fmt"
	"log"
	"os"
	"strings"
)

func main() {
	kbReader := bufio.NewReader(os.Stdin)
    
	fmt.Print("이름을 입력하세요 : ")
	strName, err := kbReader.ReadString('\n')
	if err != nil {
		log.Fatal(err)
	}
	strName = strings.TrimSpace(strName)
	fmt.Printf("당신의 이름 : %s\n", strName)
}
  • bufio의 NewReader로 standard input을 받는 입력 인스턴스 kbReader를 생성합니다.
  • ReadString('\n')에서는 엔터키를 받을 때까지 키보드의 입력을 받습니다.
  • strings.TrimSpace()를 하는 이유는 문자열 앞뒤의 필요없는 줄바꿈/공백을 없애기 위함입니다.

 

키보드로부터 정수 입력받기

package main

import (
	"bufio"
	"fmt"
	"log"
	"os"
	"strconv"
	"strings"
)

func main() {
	kbReader := bufio.NewReader(os.Stdin)

	fmt.Print("나이를 입력하세요 : ")
	strAge, err := kbReader.ReadString('\n')
	if err != nil {
		log.Fatal(err)
	}
	strAge = strings.TrimSpace(strAge)
	iAge, err := strconv.Atoi(strAge)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("당신의 나이 : %d세\n", iAge)
}
  • strings.TrimSpace()를 해줘야하는게, ReadString('\n')에서 \n까지 포함된 문자열이 strAge에 있기 때문에 불필요한 공백 등을 제거해야합니다. 아니면 정수로 변환할 때 에러가 납니다.
  • strconv.Atoi()로 문자열을 정수로 변환합니다. ParseInt()를 쓰면 안되나 싶은 생각이 들기도 할텐데, Atoi()가 ParseInt()를 써서 우리가 말하는 일반적인 정수로 변환하는 함수입니다.

 

키보드로부터 실수 입력받기

package main

import (
	"bufio"
	"fmt"
	"log"
	"os"
	"strconv"
	"strings"
)

func main() {
	kbReader := bufio.NewReader(os.Stdin)

	fmt.Print("몸무게를 입력하세요 : ")
	strWeight, err := kbReader.ReadString('\n')
	if err != nil {
		log.Fatal(err)
	}
	strWeight = strings.TrimSpace(strWeight)
	fWeight, err := strconv.ParseFloat(strWeight, 64)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("당신의 무게 : %.2fkg\n", fWeight)
}

 

  • strconv.ParseFloat()로 문자열을 실수로 변환합니다. 문자열 말고, 두번째 인자로 64 정수가 들어갔는데, Float64로 하겠다는 의미입니다.

 

반응형

+ Recent posts