본문 바로가기
Go-공부하기

Go. Tutorial 1 - Echo Program

by Thdnice 2020. 12. 16.
반응형

쉽고 매력적인 언어인 go 언어를 학습하기 위한 튜토리얼입니다. 책이나 웹페이지에 이미 좋은 학습자료가 많기 때문에, 본문에서는 실제 돌아가는 코드 위주로 튜토리얼을 진행해보고자 합니다.


 

Go.

Tutorial 1. 

 표준입력 (Stdio : Keyboard) 를 받아서, 변수에 저장 후 다시 출력하는 프로그램.

package main

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

func main() {

  fmt.Print("Enter input : ") 
  reader := bufio.NewReader(os.Stdin) 
  input, err := reader.ReadString('\n')  
  if err != nil {
    log.Fatal(err)
  }
  fmt.Println("Output :", input)

 }

 

함수(func)로 정의된  main() 이 본 프로그램의 진입점이 된다.  import 부분은 모듈을 로드하는 부분으로, 다른 언어와 다르게 모듈을 로드하고나서 사용하지 않으면 컴파일시 에러가 발생하기 때문에, 가급적 필요로 하는 모듈을 그때 그때 추가하는게 에러를 없앨 수 있는 코딩 방법이다. 

fmt.Print( ) 와 fmt.Println( )  은 포맷팅에 맞춰서 표준출력을 하는 함수로, 두 함수는 자동으로 개행(new line : \n) 을 해주느냐 해주지 않느냐의 차이가 있다. 

go 에서는 변수를 선언하고 할당하는 방식이 조금 독특하다.  통상 변수형 + 변수명 으로 지정되거나  (C/C++), 또는 변수형을 아예 생략하는 언어와 다르게 (Python) 변수임을 먼저 선언하고(var) 변수명 쓴 다음에 마지막에 변수형(data type)을 선언한다. 이후 변수에 값을 할당하는 방법은 대부분의 언어와 비슷하게 할당 연산자(assign operator) '=' 를 통해 이루어지는데, 이를 단축해서 하는 단축 변수 선언(':=') 이 가능하다. 게다가 단축변수 선언은 여러 변수에 한 번에 값을 할당 할 시에 재할당과 선언을 같이 할 수 있는 편리함도 있다.  아래를 보면 좀 감이 올 것이다.

  //변수 선언 관련 주의점. 
  var a int  // a 선언
  a = 10    // a 할당

  b := 10 // b 선언과 동시에 할당 (단축변수 선언)

  a := 20 // error (a가 이미 선언되어 있으므로)
  var b, c int  // error (b가 이미 선언되어 있으므로)
  b, c := 20, 30 // b에는 20을 재할당하고, c에는 30 선언과 동시에 할당

 

bufio.NewReader( os.Stdin ) 부분은 먼저 os 의 모듈로 표준 입력을 받는 os.Stdin 부분과, 그것을 객채로 정의하는 bufio.NewReader 부분으로 구분되며, 이 객채의 이름은 reader  이다. 이 reader 의 method (즉, bufio.NewReader 의 내부 함수) 로 ReadString 으로 문자열을 읽으며, 개행문자 (\n) 이 나타날때까지 입력을 받는다. [ReadString reads until the first occurrence of delim in the input, returning a string containing the data up to and including the delimiter.]

이런 method 들이 낯설다면 godoc 의 검색을 활용하면 훨씬 이해가 간결해지니 참고하자. (godoc.org/bufio)

reader의 ReadString( ) 은 2개의 값을 반환(입력받은 값과, 함수의 정상/비정상 상태)하기 때문에, 아래와 같이 input 으로만 할당하면 에러가 발생한다. (리턴 값은 2개인데 1개의 변수만 할당하려고 하므로), 이를 방지하기 위해서 아래 두번째 Case와 같이 err 이라는 변수를 선언해도 아래와 같은 코드에서는 에러가 발생한다. err 이라는 변수를 선언해서 할당하고나서 사용하지 않았기 때문이다! 따라서 이런 에러를 없애기 위해서는 err 를 따로 검출해서 처리해주는 식으로 err이라는 변수를 활용해야한다. 물론 가끔은 정말 return을 받기는 하지만 다시는 쓰지 않을 그럴 값들도 존재하기 마련인데, 이런 경우에는 변수명을 언더바( _ ) 로 지정해주면, 언더바로 지정된 변수에 한해서 사용하지 않아도 에러를 발생시키지 않는다.

 input := reader.ReadString('\n')  // 에러 발생
 input, err := reader.ReadString('\n')  // 에러 발생 
 input, _ := reader.ReadString('\n')
 
 fmt.Println( input )

 

물론 _ 를 쓰는 것보다는 특정 변수명을 사용해서 값과 상태를 모두 받고, 각각 처리해주는게 더 안전하고 좋은 코딩방법이므로 아래와 같이 err 값이 존재하면 (즉, 어떤 상태이상 코드가 넘어온다면), log 모듈을 이용해서 Fetal Error를 발생시키고, 상태이상을 출력하는게 좋다. 

if err != nil {
    log.Fatal(err)
  }

 

반응형

'Go-공부하기' 카테고리의 다른 글

Go. - Functions 2  (0) 2022.04.25
Go. - Function  (0) 2022.04.23
Go. - variables  (0) 2022.04.17
Go. Tutorial 2 - Echo Program 2  (0) 2020.12.22