Go language/Go 기초

Go language 간단후기1 - Rust보다 재밌다!

Razelo 2022. 1. 28. 20:49

며칠전에 프로젝트를 하다 지쳐서 하고 싶은거나 공부해볼까 하는 김에 Rust 문서를 읽으면서 맛보기를 해보고 있었다. 이후에 go언어가 눈에 들어왔다.(사실은 Rust를 좀 보다가 잠깐 글도 쓰고 이것저것 정리하고 보고싶었던 영화 정주행 달리다보니 며칠 사이에 새로운게 땡겼다.)

 

사실 go언어도 이전부터 관심갖고 지켜봐왔던 언어였다. 물론 유독 비판이 많은 언어였다. 열성 rust론자들이 있어도 go를 열성적으로 주장하시는 분들은 rust대비 거의 9:1의 비율인것 같았다. 그럼에도 불구하고 도구로써 go는 굉장히 유용하다는 의견들이 많았다. 그 의견들을 종합해보면 몇 가지로 추려질 수 있었는데 고루틴과 함께 go언어 자체의 심플함이었다. 물론 심플함 자체에 대해서도 제네릭의 부재를 말씀하시면서 비판을 하는 분들이 계셨다. 이 점은 조만간 해결될거라 생각한다. go language에 앞으로 제네릭을 쓸 수 있게 되었기 때문이다. 시간이 지나면 정식으로 사용할 수 있게 되리라고 생각한다. 

 

어제 저녁과 오늘 오전까지 많은 부분을 알아볼 수 있었다. 일반적인 변수와 타입들 그리고 struct, func와 고루틴 그리고 채널까지 알게 되었다. 어째 여기서도 struct가 있나 했다. 이걸 보면서 느꼈던 점은 rust와 go에서 왜 class 문법이 없고 struct를 사용하는데도 미래의 언어라고 여겨지는 것인지 궁금했다. 그리고 나름대로 결론을 내렸는데 개인적인 생각으로는 rust는 당연히 처음부터 차세대 시스템 프로그래밍언어이면서 c++킬러언어라고 홍보하면서 나왔기에 struct와 함께 새로운 다양한 컨셉을 녹여넣는 것이 당연지사라고 생각했다. 그런데 go는? 지극히 개인적인 추측이지만 go언어의 핵심 개발자 중 한분이 켄 톰슨이기 때문이지 않을까 생각한다. go를 탄생시키면서 간결한 문법과 낮은 러닝커브를 위해 c와 비슷하게 작은 feature로 많은 것을 가능하게 하고자 하는 철학 탓에 go의 모양새에 c의 모습이 어느정도 반영된 것이라는 생각이 들었다.  

 

언어에 대해서는 사실 고루틴과 채널을 제외하고는 별다른 할말이 없었다. 러스트를 배울 적에는 정말 신기하다? 싶을 정도로 낯설면서도 흥미로운 개념이 많았는데 go를 만져보면서는 크게 막히는 어려움이 없었다.

물론 어느 것이든 깊이 들어가면 어렵지 않은 것이 뭐가 있을까? 하지만 rust와는 달랐다. 심플하게 술술 진행할 수 있었고 여기서 매력이 발견되는데 이 심플함이 고루틴까지 이어진다.

 

그렇다면 심플하기에 안전하지 않을까? 

아니다. 고루틴을 만들어주면서도 서로 커뮤니케이션할 적에 반드시 채널을 거친다면? 데드락이 발생할 이유도 없다고 한다. 이부분이 매력적이다. 직접 고루틴을 쓰는 법을 보면 알겠지만 그냥 해당 구문에 go라고 써주면 된다. 그러면 그게 고루틴이 된다. 어째 고루틴의 작동 트리거가 go라는 이름의 feature인것을 보면 개발자들도 go의 핵심매력을 고루틴이라고 스스로 여기고 있지 않을까 싶다.  또한 채널을 보면서 마치 stream과 같은 기능을 한다는 생각이 들었다. 

 

그리고 사실 위에서 언급하진 않았지만 고루틴과 채널에 더불어 굉장히 매력적인 점이 있다. 이것은 피쳐나 기능이 아니라 바로 go의 표준 모듈이다. 정말 수많은 모듈이 있다. 기본으로 제공되는데 일부 블로그에서는 이 표준만으로 웹서버를 만들 수 있는데 이것이 파이썬이 flask나 장고같은 웹프레임워크가 있어야 웹개발을 진행할 수 있다는 점과도 비교하기도 했다. 

 

그리고 개인적으로 느낀 것이지만 이런 풍부한 모듈 지원이 go를 단독으로 사용하면서 수많은 일들을 할 수 있다는 것을 뜻했고 그러면서도 고루틴이라는 매력 포인트가 존재하며 빠른 속도와 아주 간결한 문법을 제공한다는 것이 마치 재미난 장난감과 같은 생각이 들었다. 누구든 한번쯤은 만져보고 싶은 장난감이 되는 것이다. 그만큼 매력적이다. 어째 rust를 임할때는 실수하면 큰일날 것 같고 실수시켜주지 않겠다는 철학이 느껴지면서도 컴파일러에게 얻어맞아가면서 눈치보며 코딩하는 느낌이라면 go의 경우는 신나게 써내려간다는 느낌이 들었다. 

 

다만 한가지 의아했던 점은 예외처리가 없어서 if문으로 도배를 해야했다는 점이었다. goquery를 예로 들자면 goquery에서 제공하는 수많은 func 들 중에서 대부분 결과값과 함께 다중 리턴으로 err를 반환하는데 이 err를 잡으려면 try catch가 아니라 실제로 if 구문에서 err가 nil인지 아닌지를 확인하고 nil이 아니라면 그때 errors.New("에러!") 와 같은 방식으로 처리하는 경우가 많았다. 

 

예전에 한 커뮤니티를 탐방해봤을적에 go가 verbose 하다는 의견이 많았는데 그 의견들을 읽으면서 왜? 심플하다고 했으면서 간단하게 작성할 수 있는데 왜 verbose한데? 라고 생각했었다. 근데 이제와서 보니 이런 예외처리의 상황에서 코드가 불필요하게 많이 필요할 수 있겠다는 생각이 들었다. 

 

quora에서 주로 go가 java를 대체할거라는 이야기를 많이 들었다. 하지만 개인적인 생각으로는 웹C라고 불러주고 싶은 이 언어는 웹개발 분야에서 python의 지분을 조금씩 밀어내지 않을까 싶다. 인터프리터에 가까운 빠른 컴파일 속도와 함께 당연히 파이썬보다 빠르며 동시에 고루틴을 지원하기에 GIL로 가불기에 걸려버린 파이썬을 간단히 제치고 이후 서버사이드 영역에서 자바의 옆을 같이 하게 되지 않을까 싶다. 물론 파이썬이 강점을 지닌 영역은 여전히 파이썬이 가지고 있을 것이지만 FLASK와 D장고로 개발을 할 바에 Go로 하는게 어떨까라는 분위기가 조만간 널리 형성되지 않을까 싶다. 

 

이외에도 쓰다보면 여기도 심플하고 저기도 심플하다는 것을 많이 느낄 수 있을 것이다. 

구조체 선언시에 굳이 필드끼리 콤마를 찍지 않아도 되고 세미콜론은 당연히 없고 변수 선언도 := 로 타입 추론가능하게 열어두었다. 그리고 요소 나열시에는 파이썬처럼 ... <- (점 세개 나열) 까지 지원한다. (개인적으로 이 부분들 중에서 구조체 선언시 필드 사이에 콤마가 없어도 되는게 좀 은근 좋다고 느꼈다. 이러한 부분까지 신경썼다고? 라는 느낌이랄까.)

 

하루밖에 되지 않았지만 정말 재밌게 살펴볼 수 있는 언어인 것 같다. rust를 알아볼때는 정말 집중해서 3~4일을 살펴본 것 같은데 go언어는 하루동안 그냥 재밌게 살펴볼 수 있었다. 배우면서 정리한 내용이 있는데 얼추 정리가 끝나는 대로 업로드 해야 겠다. 

 

매번 느끼는 거지만 이곳에는 너무 재밌는 것들이 넘쳐나는것 같다. 특히 이럴때 요즘처럼 여유있을때 재미난 것을 찾아서 살펴보는 것도 좋은 것 같다. 간만에 rust와 go를 살펴보면서 내가 예전부터 꼭 한번 살펴보고 싶었던 개념들을 살펴볼 수 있어서 좋았다. 프로젝트에 치이다가 간만에 힐링한 것 같다. 

 

지금 echo.New() 로 생성한 에코 서버가 무슨 일인지 POST에 인수로 잡아놓은 func에 있는 동작을 하지 않는 문제가 있어서 이게 뭔가 싶긴한데 이건 내 브라우저때문에 그런 것 같긴하다. 

 

어쨋든 오랜만에 재밌게 살펴봤다. rust는 아직 살펴볼게 많이 남았고 go는 어느정도 살펴봤다. 작은 프로젝트들을 깃허브에 올려두긴 했는데 어차피 혼자 스터디하면서 했다고 해도 내가 직접 처음부터 끝까지 만든게 아니기 때문에 곧 시간이 날때 직접 나만의 go 프로젝트를 하나 만들어볼까 하는 생각이 있다.  

(아니면 그냥 다음번에는 julia를 살펴볼까.)

반응형