Go

Go기초 (1) - 탄생부터 특징까지(이거 생략하면 손해)

로니콜먼 2023. 1. 26. 15:56

Go Language는 "공식적"으로 Google에서 만든 프로그래밍 언어이다.

최초 개발진은 3명이였다.(이후 추가 2명 영입)

 

그 3명은

로버트 그리스머(Robert Griesemer), 켄 톰슨(Ken Thompson), 롭 파이크(Rob Pike)임

 

대충 이력을 살펴보면 엄청나다

- 켄 톰슨: 유닉스의 아버지, B언어(B언어를 개선해 C언어 탄생)
- 롭 파이크: UTF-8, NewSqeak을 개발
- 러스 콕스: 프로그래밍 신동, 다수논문집필

 

거의 뭐 차범근, 박지성, 손흥민으로 팀을 꾸린수준ㄷㄷ

 

그러나 Go 언어 홈페이지에는 구글에 대한 언급을 찾아보기 힘들다.

무슨 억하심정이 있었는지 홈페이지만 보면 구글과 관련성을 파악하기 어려울정도(스폰서느낌)

https://go.dev/

 

The Go Programming Language

DevOps & Site Reliability With fast build times, lean syntax, an automatic formatter and doc generator, Go is built to support both DevOps and SRE.

go.dev

 

[Go 사용 시 특징]

go 프로젝트는 반드시 go 폴더 디렉토리에 있어야함
go1. node나 python의 npm이나 pypi의 지정된 사이트에서 모듈을 다운로드 하는 것이 아니라
원하는곳 어디에서든 코드를 다운로드하여 도메인별로 분류하여 저장한다.(go가 코드를 관리하는 방법) package.json X

 

선택적 컴파일

컴파일 - 서버시작 - 웹스크랩
(main.go 가 필요한 이유(컴파일)) - 목적에 따라 컴파일이 필요없을 수도 있음(ex.라이브러리 제작목적)
컴파일이 필요없다면 main.go로 생성할 필요는 없다.(아무렇게나)

go의 시작점

main function을 반드시 선언해야한다.
자동적으로 컴파일러는 "main package"와 그안에 있는 "main function"을 먼저 찾고 실행하기 때문

간편한 모듈 Export
function을 대문자로 시작해주기만 하면됨
대문자로 시작되는 함수호출은 위와같은 목적

타입언어
go는 타입언어기 때문에 Java나 C언어, Typescript 처럼 타입을 명시해줘야함
(const, var)

 

[Go의 장점]

1. 간단한 문법

2. 컴파일속도 빠름

3. Go의 병행성(동시실행) - 빌드가 엄청빠름

4. 쉬운 비동기 작업(goroutime 이용)

등등

* 컴파일: 개발자가 작성한 소스코드를 컴퓨터가 이해할 수 있는 기계어로 변환하는 작업

* 빌드: 소스코드 파일을 실행가능한 소프트웨어 산출물로 만드는 일련의 과정(컴파일은 빌드의 부분집합)

 

[Go 단점]

1. 없는 문법이 산더미(제네릭, 예외처리, this, 클래스 등)

2. 포인터X므로 고성능연산에는 부적합(임베디드 등)

 

대충 알았으니

이제한번 사용해봅시다.

이러면안됨 컴파일러에게 a, b가 무엇을 의미하는지 명시하지 않고 return

실행시키려하면 undefined a, b 가 뜸

Js나 Python에선 쌉가능 희안함 이게 차이임

Typescript 사용자들은 알아먹을 텐데

요따시로 해줘야함

변수타입, 리턴타입 명시

280 곱하기 12는 3360이라고합니다.

이건 무엇을 의미하냐면

바로 제연봉입니다 푸 하 하

 

GO의 특이점은

함수들의 여러개의 리턴값을 가질 수 있다는 점입니다.

Java고 Python이고 Node.js고 C고 이런경우는  없습니다.

멋지네요

괄호치고 원하는만큼 리턴값을 제시해주면 됩니다.

함수를 보니 할당된 변수 "jang"의 길이(int)와 이름(string)을 리턴시켜주네요

리턴받은 변수에 nim이라는 문자열을 이어붙여

사장님을 불러보았습니다. 4JANG nim~~

함수로 사장님을 부를수 있다니 매력적이네요

 

이렇게 불러낼수도 있답니다.

 

이제 프로그래밍의 꽃 "반복문"을 해봅시다.

for문은 간단합니다.

size [5]의 문자열 array를 100번 출력해보았습니다.

어지럽네요 아무리 로니콜먼이 미스타 올림피아의 킹이라지만 이건 좀 아닌거같네요ㅎㅎ

 

이번거는 go의 꽃입니다.

"naked" return이라고 하네요 "적나라한 리턴?!"

얼마나 적나라하길래..

소스를보면 위에서 선언한 lenAndUpper 함수와 달리 리턴 변수명을 작성해주었다.

이러면 return만 때려도 알아서 무엇을 리턴해줘야할지 인식하고 리턴 시켜준다.

결과는 동일

이것이 바로 "naked return" 이라고 합니다.. 적나라하긴 하네요

 

다음 볼것은 "defer"라는 기능입니다.

이건 function이 끝났을때 추가적으로 무엇인가를 동작하도록 할 수있다고 하네요.

함수 동작 이후 api로 요청을 보낸다던가 다양하게 사용 가능합니다.

사용법은 아주 간단합니다. 앞에 defer 붙이고 작동시키고 싶은 코드를 작성하면됩니다.

위에 나왔던 lenAndUpper 함수를 응용하여 defer를 사용해봅시다.

 

 

defer 후에 fmt.Println으로 문자열을 출력해주었습니다.

이로써 사장님께 월급올려달란 말을 go로 할수 있게되었습니다.