[go language] 2번째! echo 프로그램

이번에는 구글 튜토리얼에 나와있는 echo 프로그램을 공부해 보겠습니다.


package main

import (   
	"os"
	"flag"
)

var omitNewline = flag.Bool("n",false,"don't print final newline")

const (
	Space = " "
	Newline = "\n"
)

func main (){
	flag.Parse()
	var s string  = ""
	for i:=0 ; i < flag.NArg() ; i++  {
		if i > 0 {
			s += Space
		}
		s += flag.Arg(i)
	}
	if !*omitNewline {
		s += Newline
	}
	os.Stdout.WriteString(s)
}


코드는 위와 같습니다.
첫번째 라인부터 살펴보겠습니다.


package main 
이부분은 저번시간에도 보았던 팩키지 선언부분입니다.


import (
	"os"
	"flag"
) 
팩키지를 import하는 부분인데 저번시간과는 다르게 그룹으로 import하고 있습니다.
이부분도 go랭기지에서 특징적인 부분입니다. 아래에서 보시겠지만 type,const, var도 위와 같은 방식으로 사용가능 합니다. import를 여러번 써주지 않아도 되기 때문에 생산성이 향상될 것 입니다.
 
var omitNewline = flag.Bool("n",false,"don't print final newline") 
var키워드는 변수를 선언한다는 뜻입니다. omitNewline에 할당되는 flag.Bool은 아래에서 살펴보도록 하겠습니다.

const (
	Space = " "
	Newline = "\n"
)
const 키워드는 상수를 나타냅니다. import와 마찬가지로 그룹화 해서 선언하고 있습니다.

flag.Parse() 
여기서는 flag팩키지의 Parse()함수를 호출하였습니다. 이부분도 밑에서 따로 살펴보겠습니다. 
간단히 내용은 사용자의 커맨드라인 argument를 입력받는 내용입니다.

var s string  = "" 
[var키워드] [변수이름] [변수 타입]의 형식으로 변수를 선언해 줍니다.
스트링 타입변수 s 를 ""로 초기화 해주었습니다.

for i:=0 ; i < flag.NArg() ; i++  {
		if i > 0 {
			s += Space
		}
		s += flag.Arg(i)
	} 
for문입니다. c나 java와의 차이점은 다음과 같습니다.

1. for의 [초기화;조건;증감] 구문을 괄호로 둘러싸지 않습니다.
2. for뒤에 하나의 라인(1개의 명령)이 오더라도 중괄호로 둘러주어야 합니다.

# 위의 내용은 if문에도 적용됩니다. 그리고 go 랭기지에는 while문이 없습니다.


if !*omitNewline {
		s += Newline
	} 
flag.Bool()함수는 아래에서 살펴보겠지만 *bool 값을 리턴합니다. 그값에따라 not연산자가 붙었기 때문에
거짓일 경우 s에 NewLine을 추가하고 진실일 경우에는 NewLine을 추가하지 않습니다.


os.Stdout.WriteString(s)

os팩키지는 플렛폼에 독립적인 여러가지 시스템기능들을 제공하는 팩키지입니다. 팩키지내에 내용이 꾀 많기 때문에 WriteString(string s)함수만 다루도록 하겟습니다. Stdout(Standard out)으로 (s)의 스트링을 쓰라는 내용인데, 즉 화면에 s의 문자열이 출력되게됩니다.


이것으로 코드를 대략 살펴 보았습니다.
이 코드를 이해하기 위해서 flag팩키지에 대하여 알아보겠습니다.

flag 팩키지는 Command Line Argument를 다루는 함수들이 들어 있습니다.

예를 들어, 

          > gcc -c hello.c 
라는 명령이 있으면,  [gcc]는 프로그램을 실행시키는 명령이고, [-c]와 [hello.c]는 그 프로그램에 argument로 전달되어 작업을 수행하게 됩니다.

여기서 [-c]와 [hello.c]와 같은 argument를 다루기 위한 팩키지가 [flag] 팩키지 입니다.>>

우선은 가장 먼저 나왔던 [ flag.Bool()함수를 알아 보겠습니다. ]

func Bool(name string, value bool, usage string) *bool

위 와같이 선언되어 있습니다.
[func]로 함수임을 알수 있습니다.
인자로 name이라는 스트링과, value라는 기본값을 나타내는 bool, usage라는 스트링을 받고 있습니다.
리턴값은 *bool로 bool의 포인터를 리턴하고 있습니다.

var omitNewline = flag.Bool("n",false,"don't print final newline")
코드에서 사용된 Bool을 해석해보면 , "n"라는 이름이고 기본값은 false입니다. 마지막의 NewLine을 출력안하는 기능을 하기위해 선언했다고 설명하고 있습니다.

실제로 실행할때 [-n]을 같이 입력해주면, *omitNewLine의 값은 true를 갖게 됩니다.



두번째로 
func Parse() 
를 알아보겠습니다.
Parse()함수는 그다지 복잡하지 않고 그냥 Command Line Argument와 flag를 읽어 오는 일을 합니다.


세번째 로는 for문에서 사용되었던
func NArg() int
함수를 알아보도록 하겠습니다.
Number of Argument의 약자인데 말 그대로 Parse함수로 입력받은 Argument의 수를 int형으로 리턴해 줍니다.
[-n]과 같은 플레그는 제외하고 그 뒤의 [hello.c]와 같은 argument의 수만 포함됩니다.

마지막으로 
func Arg(i int) string
를 알아보겠습니다.
Arg(i) 는 i번째 Command Line Argument를 리턴해 줍니다. 물론 리턴 타입은 스트링입니다.

이것으로 echo.go 프로그램을 이해할 정도의 내용을 공부해 보았으니 마지막으로 실행을 해보겠습니다.


[8.exe]를 실행한 화면입니다. 예상했던데로 우리가 입력했던 argument가 출력됩니다.
[-n]플레그 입력하니까 Line이 한줄 덜 나오는것도 확인할 수 있습니다.
우리가 flag.Bool함수 에 name으로 주었던 [n] 말고 다른것을 입력하면 다음과 같은 에러 메시지가 출력됩니다.

이것으로 echo프로그램에 대해 알아보았습니다. 수고하셨습니다.^^*

# 제가 알려드린 방법으로 windows에 go 컴파일러를 설치하신분은 위와 같이 코드를 작성하면 안됩니다.
# 역시 비공식이기 때문에 버그가 존재하는 것 같습니다. 
# 그룹화 선언 부분이 인식이 안되고,  라인의 끝에 세미클론을 해주어야 컴파일 되었습니다.
# 윈도우에서 되는 코드는 다음과 같습니다.

package main

import "os"
import "flag"

var omitNewline = flag.Bool("n",false,"don't print final newline")

const Space = " "
const Newline = "\n"


func main (){
	flag.Parse();
	var s = "";
	for i:=0 ; i  0 {
			s += Space
		}
		s += flag.Arg(i)
	}
	if !*omitNewline {
		s += Newline
	}
	os.Stdout.WriteString(s);
}	

'Go Language' 카테고리의 다른 글

[go language] 1번째! Hello 세상!  (0) 2010.01.16
Go Language Compiler 설치하기!!  (0) 2010.01.16