[GO LANGUAGE] GO 언어 시작하기
Google에서 2009년 만든 새로운 프로그래밍 언어 Go language
- 범용 프로그래밍 언어(ex_ Python, Java)
- 시스템 프로그래밍, 네트워크 프로그램 개발 목표로 만들어짐
- C언어와 매우 비슷!!
- 10개 내외 키워드 만으로 프로그래밍 가능
-> Keywords
break case chan const continue
default defer else fallthrough for
func go goto if import
interface map package range return
select struct switch type var
일단 이 정도의 키워드만 습득하더라도 Go를 이용하여 왠만큼의 프로그래밍을 할 수 있다는 사실 !!
( 너무 겁먹었었어..... )
- go는 인터넷을 기본 개발환경으로 하므로, 원활한 개발을 위해 PC가 항상 인터넷에 연결되어야 함
- 따라서 github, bitbucket 또는 직접 구성한 git서버 필요
-> 만약 github와 bitbucket의 차이: github = (Private 전환 시 유료) bitbucket = (Private 전환 시 무료)
-> bitbucket은 특정 인원만 공유하려면 정해진 인원 수 만큼만 공유가 가능하다는 단점이 있지만,
그래도 프라이빗 공간을 무료로 쓴다는 게 큰 장점
- go directory : src / pkg / bin
-> src : 패키지 소스코드 저장되는 장소
-> pkg : 패키지 소스코드 빌드하여 만들어진 라이브러리 파일(a -ar archive)위치
-> bin : 패키지가 main함수 포함시 실행파일(exe) 만들어짐. 이 실행파일이 복사되는 곳
- go 명령어 살펴보기 : go run / go build / package / import /func
-> go run : 임시 디렉터리에서 코드 컴파일 및 실행
-> go bulid : 소스코드 컴파일
-> package : 패키지 선언. 모든 go언어는 패키지 선언으로 시작해야 함
( C언어와 비슷한 점 - go 언어도 1)실행 프로그램 / 2) 라이브러리 두 개의 코드 타입 가짐 )
1) 실행 프로그램 - 쉘에서 명령 내려 직접 실행 할 수 있는 프로그램
2) 라이브러리 - 다른 프로그램에서도 이용할 수 있게 패키징된 코드 모음
--> 실행 프로그램 만들기 위해 go코드는 반드시 package main 선언해야 함
-> import : 외부 패키지 import
-> func : 함수 정의 ( 실행 가능한 타입의 go코드는 반드시 하나의 main함수 가지고 있어야 함 )
-> fmt =패키지 이름
- Go언어에서 라이브러리 타입 패키지는 .a(정적 라이브러리) 형태로 만들어짐
- 공유 라이브러리를 지원하기는 하지만 운영체제에 따라 제한적일 수 있음
-> 그래서 주로 정적 라이브러리를 코드내에 포함해 하나의 실행 파일로 배포(Deploy)
- go의 주요 특징
1) 단순하고 실용적인 언어
-> go언어에 없는 것들
- 패턴 매칭
- 함수 프로그래밍
- no immutable variables
- no Exception
- no Class
- no Generics
2) 2주면 모든 기능에 익숙해질 수 있음 ( 나의 2주와 당신의 2주는 분명 다를거야....)
3) 직관적
4) 친 클라우드 언어
-> 애초에 구글의 클라우드 서비스를 위하여 탄생한 go언어는 클라우드 환경에 잘 맞을 수 밖에.
분산환경은 시스템의 분산을 의미하기도 하지만, 소프트웨어의 분산을 의미하기도 함
필수 기능만 가진 다양한 소프트웨어가 서로 데이터를 주고 받게 작동을 하는 것이 효율적
이쯤하여 생각나는 ..... 요즘 나의 썸들 Linux 와 Docker ...... ㅎㅎㅎ
5) 클래스와 객체가 없지만 객체지향 by STRUCT
- > GO는 CLASS 와 OBJECT가 없지만 객체 지향 언어가 아닌건 아니다.
사실, 객체지향언어라는 것은 프로그래밍 방법론에서 언어와 직접적인 상관이 있는 것이 아니다.
C로도 , C++로도 사실은 객체지향을 할 수는 있지만 적합하지 않을 뿐.
여기에서 자연스럽게 객체지향 언어이냐 아니냐의 잣대가 된 것은 CLASS 와 OBJECT의 존재유무
게다가 GO는 INHERITANCE 조차 지원하지 않으므로 전통적인 시각에서 봤을 때 객체지향 언어라 하기가....음.....
하지만....
-> 매서드 생성 가능, INTERFACE 이용한 다형성 구현 가능, COMPOSITION으로 상속기능 구현 가능 하다는 것
-> STRUCT : 하나 이상의 필드들로 구성된 데이터 타입으로 레코드 형식 데이터 그룹 만들기 위해 사용
--> GO는 STRUCT와 매서드가 서로 분리됨
--> 캡슐화 지원 : 대문자로 시작 = Public / 소문자로 시작 = Private(Private 변수or method는 패키지 내에서만 사용 가능)
6) Error 처리
go에는 예외가 없으므로, 반환 값이 error인지 아닌지를 비교하여 error 처리함 (ex_C언어)
go는 두 개 이상의 값을 반환할 수 있으므로, 실행 반환값과 error를 함께 넘기는 식으로 처리 가능
-> "nil" : error값이 nil인지 아닌지로 검사 ( ex_ err != nil -> error 즉, err가 nil이 아니면 errror. 응??)
-> 모든 error return에 대한 코드 만들어야 하며, 함수 만들다 보면 error처리 코드가 반 이상 차지......
Hyperledger fabric 프로젝트 진행하면서 울며 겨자먹기로 시작한 go언어 ...
지레 겁먹지 말고 알고 보면 괜찮은 언어이길 바라며 !!!
To be continue...
< Reference >
1. https://golangkorea.github.io/post/go-start/getting-start/
2. https://golangkorea.github.io/post/go-start/feature/