Go 개요
Go 개요
Go는 2009년 Google에서 오픈 소스로 발표한 프로그램 언어이다. 기존의 정적 입력 프로그램 언어의 장점과 동적 입력 프로그램 언어의 장점을 결합한 비교적 새로운 프로그램 언어이다.
2009년 이전, Google사에서 서버를 구현하는 프로그램은 정적 형식 언어인 C++, Java가 주류였다. 이러한 언어는 효율적인 컴파일, 효율적인 실행, 프로그램의 용이성의 세 가지 모두를 충족시키지 못했다. 또, 안전성이나 효율성보다 프로그램의 용이함을 선택하는 프로그래머는 동적 형식의 인터프리터 언어(Python, JavaScript 등)를 선택하고 있었다. 이러한 배경에서 두 프로그램 언어의 장점을 살린 새로운 프로그램 언어가 요구되어 Go라는 새로운 언어의 개발이 시작되었다.
Go의 주요 설계 정책은 가능한 한 효율적이고 안전하며 뛰어난 프로그램 언어로 만드는 것이다. Go에서는 코드의 쓸데없는 설명과 복잡성을 줄이는 것이 적극적으로 이루어지고 있다. C 언어와 같이 앞부분에 선언이나 헤더 파일은 필요하지 않으며 선언은 한 번만 한ㄷ다. 또, 단순화를 위해 C++ 나 Java 와 같은 형태 계층이나 제네릭스, 예외 처리, 단언문, 오버로드가 없다.
새로운 언어이지만 이미 많은 기업에서 사용되고 있다. 특히 가상 컨테이너의 Docker와 컨테이너 오케스트레이션 시스템의 Kubernetes는 Go로 구현되어 잘 동작한 이력이 있다.
Go의 주요 특징
- 형식
gofmt
또는go fmt
명령을 사용하면 코드를 자동으로 포맷할 수 있다.
- 코멘트
- C++나 Java와 동일하게
/* */
블록 코멘트,//
으로 라인 코멘트가 된다. 코드 변수나 함수에 적절한 주석을 삽입하면godoc
명령이 문서를 생성한다.
- C++나 Java와 동일하게
- 네이밍
- 패키지 이름은 일반적으로 영어 단어 한 단어로 설정된다. 대문자와 소문자를 혼합한 여러 단어나 밑줄은 사용하지 않는다.
- 패키지 밖에서 참조되는 변수/함수의 명명은 선두 문자를 대문자로 하는 것이 규칙이다. 이 규칙은 액세스 제어를 수행하므로 액세스 식별자(
private
,public
등)이 없다. 또한 getter/setter는 자동으로 지원되지 않는다. - 하나의 메소드만을 가지는 인터페이스에는 그 메소드명의 뒤에
er
를 붙인 이름으로 하는 것이 관례dl다. 즉,Read
라는 메소드의 인터페이스 이름은 Reader라는 인터페이스이다.
- 세미콜론
- 문장 끝의 세미콜론은 필요하지 않는다.
- 제어 메커니즘
:=
을 사용하면 유형을 지정하지 않고 변수를 선언할 수 있다.if
또는for
조건식에()
가 필요하지 않는다.do-while
또는while
루프가 없다. 모두for
에 기재할 수 있다.switch
의 각case
문으로break
은 필요 없다. 자동으로break
가 실행된다.- 채널 변수를 사용한 실행 제어는
select ... case
문을 사용한다.
- 기능
- 여러 반환 값에 해당한다.
- defer 문을 사용하면 함수가 종료된 후 처리를 수행할 수 있다. 뮤텍스의 잠금 해제나 파일의 클로즈 등에 이용된다.
- 데이터
- 메모리 할당은
new
함수 또는make
함수에 의해 수행된다. new
함수는 제로화만으로 이용할 수 있는 형태(bytes.Buffer
또는sync.Mutex
)로 사용된다.make
함수는 배열의 슬라이스나 맵, 채널을 작성하는 경우에만 사용된다.- 제로치만으로는 이용할 수 없는 형태는
constructor
에 의한 초기화를 한다. Go의 생성자는 형식 포인터를 반환하는New {typename}
이라는 함수이다. fmt
패키지를 이용하면 형식에 따라 다양한 형식으로 출력할 수 있다.
- 메모리 할당은
- 초기화
- 일반적인 상수, 변수 정의 외에도
init
함수를 사용할 수 있다.init
함수를 사용하면 프로그램이 실행되기 전에 패키지 변수의 유효성을 확인할 수 있다.
- 일반적인 상수, 변수 정의 외에도
- 메소드
- 클래스의 구조는 없지만, 임의의 형태에 메소드 (리시버 인수를 수반하는 함수)를 정의할 수 있다. 이것은 이른바 메소드의 오버라이드(override)가 된다.
- 메소드에 포인터 리시버 인수를 이용하는 것으로 리시버내의 변수의 변경이나 메모리의 절약을 할 수 있다.
- 인터페이스
- 다른 언어와 마찬가지로 여러 인터페이스를 구현할 수 있다. 다만, C++나, Java와 같이 구현하고 있는 인터페이스를 명시할 필요는 없다.
- 빈 인터페이스에서 정의한 변수는 모든 유형의 할당이 가능하다. 변수의 형태를 판별하는 처리(형 단언문)등에서 이용된다.
- 인수나 반환값에 인터페이스형을 지정해, 특정의 형태에 의존하지 않는 처리를 실현하는 것이 가능하다.
- 공백 식별자
- 복수의 반환값이 있지만 한쪽 밖에 사용하지 않는 경우(range에 의한 루프나 인터페이스 체크등)나, 미사용의 변수가 있지만 개발중은 디버그로서 남겨 두고 싶은 경우 등에, “_"(블랭크 식별자) 사용할 수 있다.
- 임베디드
- Go에는 클래스의 상속 관계는 없지만, 구조체 변수에 다른 구조체나 복수의 인터페이스를 짜넣는 것으로, 복수의 인터페이스를 가지는 형태를 간단하게 정의할 수 있어 짜넣은 변수에 처리를 위양하는 것이 수 있다.
- 동시 실행 제어
- goroutine(Go 루틴)을 이용하여 함수를 쉽게 비동기 실행시킬 수 있다. go {함수 이름}이라고 부른다.
- 채널형 변수를 이용하는 것으로, goroutine간에 데이터를 공유하거나, 비동기 실행된 처리의 완료를 기다리거나, 세마포어로서 이용할 수가 있다.
- 오류 제어
- 함수는 여러 반환 값을 반환할 수 있으므로 간단한 오류 값이 아니라 오류에 대한 자세한 컨텍스트를 반환할 수 있습니다(Go에서는 error 인터페이스를 구현하는 것이 좋다).
panic
함수에 의해 의도적으로 에러를 발생시키거나 recover 함수에 의해 panic에 의한 에러로부터 처리를 복귀시킬 수가 있다.
Go의 운영 환경
공식 사이트에서 제공되는 바이너리는 다음 OS/아키텍처에서 사용할 수 있다. 다른 OS 또는 아키텍처에서 사용하는 경우 소스에서 설치해야 한다.
OS | 아키텍처 | 비고 |
---|---|---|
FreeBSD 10.3 이상 | x86 x86_64 |
데비안 GNU/kFreeBSD는 지원되지 않는다. |
Linux 2.6.23 이상 | x86 x86_64 armv6 armv8 s390x ppc64le |
CentOS/RHEL 5.x는 지원되지 않는다. 다른 libc에서 사용하려면 소스에서 설치가 필요하다. |
macOS 10.12 이상 | x86_64 | cgo 지원을 위해서는 Xcode 배포가 필요하다. clang 또는 gcc를 사용해야 한다. |
Windows 7 이상 Windows Server 2008R2 이상 |
x86 x86_64 |
cygwin이나 mysys 대신 MinGW gcc를 사용해야 한다. |
유사한 기능을 가진 OSS
Go는 많은 언어의 아이디어를 참고로 만들어졌지만, 특히 관련이 있는 프로그램 언어는 다음과 같다.
- C 패밀리 (기본 구문에 관하여)
- Pascal / Modula / Oberon 가족 (선언, 패키지 관련)
- Newsqueak / Limbo (동시성에 관하여)
Go 라이센스
Go는 BSD 라이센스하에 배포된다. 무보증인 것의 명기와 저작권 및 라이센스 조문의 표시를 조건으로, 자유로운 변경, 배포가 인정되고 있다.