최근에 바뀐 go 언어 프로그래밍의 습관, 나름대로의 규칙들. #2
By SeukWon Kang
이전 글에 이어 지는 내용입니다. (http://kasw.blogspot.kr/2015/05/go.html)
- 가능한 작은 단위 까지도 각 struct를 독립 package화 하기 이것은 정말로 습관화하려고 노력하는 것입니다. package 이름을 struct 이름과 같게 하고 패키지내 파일 이름들을 ( 좀 규모가 되는 struct 인경우만 ) structnameattrib.go
- struct 의 정의와 New() 함수 , field 의 accessor 들을 정의
structname.go
- struct 가 해야 하는 기능들을 정의
structname_test.go
- go test 용
로 정하기
작은 규모의 struct인 경우는 상관 없지만 좀 큰 규모의 struct는 아무 생각없이 한 파일에 코드를 짜넣다 보면 1000라인이 넘어 가는 경우도 생기더군요. 그래서 일단 위와 같은 규칙으로 파일을 분리하곤 합니다. 더 나아가면 private methed 가 있는 파일과 public method (interface에도 정의되어 있는 ) 가 있는 파일을 분리하기도 합니다.
그리고 이렇게 가능한 작은 단위까지 package로 분리하면 structname.New() 와 같은 형식으로 새 object를 만드는 것이 규칙화 됩니다.
- struct field accessor naming struct 내의 field들을 가능한 private field 로 정의하고 field accessor이름을 GetXXX , SetXXX로 정의 하기 이것도 go 언어의 권장사항은 GetXXX 가 아니고 그냥 XXX() 입니다. 그런데 저는 method는 동사가 들어 가는 것이 편해서 ( field와 method를 구별하기 좋으니까. ) 굳이 Get을 붙여서 만듭니다.
이 규칙에서 약간 문제가 되는 것이 field들을 private로 만들면 gob나 json등의 serialization에서 문제가 됩니다. (그래서 초반 코드들은 field들을 public으로 만들었습니다. ) 그런데 interface를 대량으로 사용하게 되니 어쩔수 없이 ( 불가능한 것은 아니지만 ) Get, Set method를 정의하고 private field로 만들게 되더군요. 이 경우struct를 serialize를 하려면 marshaler 들을 만들어 주면 됩니다. json은 (Un)MarshalJSON 이고 gob등은 (Un)MarshalBinary 입니다. 이전에 이 글 (http://kasw.blogspot.kr/2015/01/go.html) 에 간단히 적었습니다.