[go language] 2번째! echo 프로그램
Go Language 2010. 1. 19. 00:53
이번에는 구글 튜토리얼에 나와있는 echo 프로그램을 공부해 보겠습니다.
이것으로 echo.go 프로그램을 이해할 정도의 내용을 공부해 보았으니 마지막으로 실행을 해보겠습니다.
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 ; i0 { 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 |