[GO LANGUAGE] GO 언어 시작하기

in #golanguage6 years ago (edited)
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/