구글 go 언어를 공부하면서 몇몇 중요 포인트를 메모중입니다. (4/N)
By SeukWon Kang
금방 끝날줄 알았는데 남은것이 많더군요.
이제부터는 좀 두서없는 내용이 이어집니다.
reflection package 를 사용해서 func TypeOf(i interface{}) Type func ValueOf(i interface{}) Value 를 사용할수 있습니다. 이런게 얻어진 Value object에 대해서 struct object 였다면 Method( 2 ).Call( some args ) 형태로 실행을 시킬수도 있습니다.
os.Stdin : 표준 입력입니다. os.Open 을 사용해서 파일을 열수 있습니다. io/ioutil 패키지에 ReadFile 을 사용하면 파일을 한번에 읽고, WriteFile로 한번에 씁니다. fmt.Fscanln을 사용하면 space separated file 을 편하게 읽을수 있습니다. 물론 encoding/csv 이 더 좋겠지요. compress/gzip 을 사용하면 gzip 파일을 편하게 읽고. close 는 언제나 defer를 사용하는 걸 잊지마세요. commandline argument는 os.Args 입니다. 아니면 flag package를 고려하시고.
json/xml/google protobuf 도 잘지원합니다. go 의 native format은 gob(GO binary format) 라고 부르는 군요. ( python의 pickle 같은겁니다. )
go는 exception catch가 없습니다. 대신 defer-panic-and-recover 형태를 사용합니다. Func1 내에서는 defer를 사용하구요. if value, err := pack1.Func1(param1); err != nil { fmt.Printf(“Error %s in pack1.Func1 with parameter %v”, err.Error(), param1) return // or: return err } 형태입니다. 이쪽이 더 가볍다고 하는 군요. 표준 error type은 존재합니다. type error interface { Error() string } import “errors” err := errors.New(“적당한 에러 문자열”)
아니면 error struct를 정의해서 사용할수도 있지요. 예를 들면 os package에는 type PathError struct { Op string Path string Err error } func (e *PathError) String() string { return e.Op + “ ” + e.Path + “: “+ e.Err.Error() } 가 정의 되어 있어서 if e, ok := err.(*os.PathError); ok { } 형태를 쓰거나 switch err := err.(type) { case ParhError: // 에러 처리 default: fmt.Printf(“Not a special error, just %s\n”, err) } 형태를 쓸 수 있습니다.
run-time exception 과 panic 실행중에 런타인 예외가 발생하는 경우 go는 runtime.Error interface 타입의 인자로 runtime panic을 발생시킵니다. 그러면 프로그램은 예외에 대한 메시지를 표시하면서 crash 하게 되는데 이 runtime.Error interface 타입은 RuintimeError() method를 가지고 있습니다.
이 것을 고의적으로 발생시키려면 기본 내장 함수인 panic()을 사용하면 됩니다. ( 인자로는 아무 type이어도 상관없습니다. 보통 string을 씁니다. )
이러한 panic을 잡아서 복구하려면 반드시 defer 된 코드 내에서 recover() 기본 내장함수를 사용합니다. 이 기능은 다른 많은 언어의 catch 과 같이 작동합니다. - stack을 되돌아가면서 recover를 찾습니다. 사용 형태는 if err := recover(); err != nil { } 같이 씁니다. go 언어에서 error handling을 하는 권장사항. 자신의 패키지 내에선 반드시 recover를 한다. 그리고 패키지 외부로는 error value를 return 한다.
다음엔 goroutine과 channel 입니다. - 앞으로 한참 더가야 할듯..