Go언어 시작하기

Go 언어 / Go lang

구글이 2009년에 만든 프로그래밍 언어이다. 대학교를 들어오기 전에 만들어진 언어인데 난 비교적 최근에서야 듣게 되었다. Go이기 때문에 검색이 불편하다고 한다. Go언어 또는 Go lang 이라고 검색하면 된단다. 2016년 10월 현재 1.7.3버전이 최신이다.

Redmonk에 의하면 16년 기준 15위에 차지하고 있다. redmonk는 깃허브와 스택오버플로우 기반으로 순위를 매기기 때문에 좀 더 피부로 와 닿을 수 있는 점이 특징이다.

비교적 덜 알려진 언어로 잘 몰랐는데 언어 자체가 좋고 나쁜 경우는 없으므로 Go언어도 나름의 장점과 단점을 가지고 있다.

Rank of Languages

그래프를 보면 알 수 있드시 16년 15위에 위치하고 있고 계속 순위가 올라간 것을 볼 수 있다. 듣지도 보지도 못하고 사라져간 언어도 수없이 많을 터 이지만 살아 남은 데는 이유가 있을 것이라 생각된다.

뭐가 좋고 나쁜가

Go언어는 C++과 Java, Python의 장점들을 모아 만들어졌다. 또한 전통적인 컴파일, 링크 모델을 따르는 언어이다. C와 문법이 비슷하고, Java의 가비지 컬렉션기능을 제공하며 Python만큼 쉽게 작성할 수 있다.

1.5버전 이전에는 C언어로 작성된 컴파일러로 컴파일 되었는데 1.5이후 Go언어 자체로 작성된 컴파일러가 등장했다. 또한, Go는 단순하고 간결하게 프로그래밍 하는 방법을 지향하는데 Java의 절반에 해당하는 25개의 키워드만을 사용한다. 컴파일이 빠르고 정적 타입검사로 안전하게 코딩할 수 있다. 시스템 프로그래밍을 위해 개발된 만큼 concurrent 프로그래밍을 잘 지원하는 것이 특징이다.

  • 소스 코드 형식을 자동으로 맞춰주는 도구 및 여러 편리한 도구가 기본으로 제공된다.
  • 함수 리터럴 및 클로저를 자유자재로 사용할 수 있다.
  • 명시적으로 인터페이스를 지정하지 않아도 구현이 가능하며, 기존 코드를 고치지 않고도 유연한 구현이 가능하다.
  • 채널을 이용해 동시성 구현을 락 등을 이용하지 않고 간편하게 할 수 있다. Dead lock 이나 Mutual Exclusion 을 파악하기 쉽다.

Hello World

package main

import "fmt"

func main() {
  fmt.Println("Hello, World")
}

Go 놀이터를 이용하면 브라우저에서 쉽게 실행해 볼 수 있습니다. 심지어 휴대폰에서도!


자료형 및 변수

Go언어는 자료형을 정적으로 검사한다. C와 같이 엄격하게 자료형을 구분하고 한 번 정했으면 해당 자료형만 담을 수 있다. 그렇기 때문에 동적 자료형을 지원하는 언어와 달리 변수 선언이 필요하다.

변수 선언

C, C++, Java와 변수 선언과 자료형을 명시하는 구문 순서가 다르다. 처음 봤을 때 Objective-C를 접했을 때와 비슷하게 역시나 어색했다.

C C++ Java :

int x;

Go :

var x int

보다시피 순서가 반대로 되어 있다. C, java 순서로 배운 나는 “변수 x는 int형이다.” 라고 읽히는 Go언어가 자연스럽다 고 하는 말이 쉽게 와닿지 않는다. 사실 꽤 만흔 언어에서 이런 순서로 나타내는 경우가 있다.

C C++ :

int array[5];

Java :

int[] array = new int[5];

Go

var array [5]int

배열도 단순 변수 선언과 크게 다르지 않은데 이 정도면 수용할 수준이다. 기본적으로 C는 자료형을 왼쪽에 쓰고, 자료형을 만들기 위해 어떤 형태로 수행해야 하는지를 오른쪽에 표한하지만, Go는 변수 이름은 왼쪽에 쓰고 오른쪽에 자료형을 설명하는 방식이다.


자료형 추론

자료형을 반복해서 입력하는 일은 귀찮은 일이 될 수 있다. Go언어의 특징 중 한 가지는 여타 언어에서 나타나는 특징 중 한가지 일 수 있는데, 자료형이 무엇인지 확실히 알 경우엔 명시해서 자료형을 적지 않아도 되는 점이다.

var i = 10
var p = &i
i := 10
p := &i

기본적으로 정수형이나 포인터형 일 경우 선언없이 할당으로 자료형이 결정되고, 이마저도 var를 생략하고 =대신 :=로 적어서 사용할 수 있다. 위 아래는 동일한 코드이다. 파이썬과 비교하면 파이썬은 동적 자료형으로 runtime시 자료형을 확인하지만 C와 Go는 정적 자료형으로 complie시 변수의 자료형을 검사한다.

i := 10       // 가능. 새로운 정수형 변수
s := "hi"     // 가능. 새로운 문자열 변수
i = 20        // 가능. 변수 i 값 변경
j = 30        // 불가능. 선언되지 않은 변수
i = "hello"   // 불가능 i는 이미 정수형 변수
i := 30       // 불가능. i는 이미 선언 됨

함수와 제어

hello world 만큼이나 간단한 코드를 하나 짜보기로 했다. Recursive Factorial

package main
import "fmt"

func fac(n int) int {
  if n <= 0 {
    return 1
  }
  return n * fac(n-1)
}

func main() {
  fmt.Println(fac(5))
}

if 조건문을 C와 Java같이 ( ) 로 감싸지 않는 모습을 볼 수 있다. 또한 main과 fac 함수와 같이 시그니처 바로 뒤에 { 중괄호를 열어줘야 한다. 왜냐하면 구문 분석기를 통해 문장 끝에 자동으로 세미콜론이 붙게 된다. 이 때문에 우리는 세미콜론을 안 붙여도 됨과 동시에 붙이면 안된다는 규칙이 생겼다.


연습문제

  1. N줄을 출력하는 함수
  2. 하노이탑
  3. N번째 피보나치 수
Jekyll을 이용해 github 블로그 만들기

미루고 미루던 블로그를 시작하기로 마음 먹은건 공개소프트웨어 수업때문이다. 활발하게 활동하고 있고 관심이 가는 오픈 소스 프로젝트를 선정하고 프로젝트에 기여해 보자는 것이다. 오픈 소스 활동에 앞서 블로그를 만들어 프로젝트에 필요한, 공부한 것들을 정리해 올려보기로 했다.

알아보던 중 Jekyll과 github를 이용한 블로그들이 많다는 것을 알았고 곧바로 환경설정에 들어갔다.

Jekyll

Jekyll은 심플하고 블로그 지향적인 정적 사이트 생성기이다. 또한 Jekyll은 GitHub Pages 의 내부 엔진이기해서 자신의 프로젝트 페이지나 블로그, 웹사이트를 무료로 GitHub 에 호스팅 할 수 있다. 다른 블로그를 택하지 않고 GitHub를 이용한 이유가 여기에 있다. 내 repository를 꾸밀 수 있고, 대형 포털에 종속되지 않는다는 점이 매력적이 었기 때문이다.

설치

설치과정에서 삽질 좀 했다. 내 Mac에는 Ruby가 기본으로 설치돼 있는 줄 알았고, 생각 없이 jekyll만 설치, 실행하려다 보니 에러가 났는데 알고 보니 설치가 안돼 있었다.

$ gem install bundler

Below is just about everything you’ll need to style in the theme. Check the source code to see the many embedded elements within paragraphs.

Heading 1

Heading 2

Heading 3

Heading 4

Heading 5
Heading 6

Body text

Lorem ipsum dolor sit amet, test link adipiscing elit. This is strong. Nullam dignissim convallis est. Quisque aliquam.

This is emphasized. Donec faucibus. Nunc iaculis suscipit dui. 53 = 125. Water is H2O. Nam sit amet sem. Aliquam libero nisi, imperdiet at, tincidunt nec, gravida vehicula, nisl. The New York Times (That’s a citation). Underline. Maecenas ornare tortor. Donec sed tellus eget sapien fringilla nonummy. Mauris a ante. Suspendisse quam sem, consequat at, commodo vitae, feugiat in, nunc. Morbi imperdiet augue quis tellus.

HTML and CSS are our tools. Mauris a ante. Suspendisse quam sem, consequat at, commodo vitae, feugiat in, nunc. Morbi imperdiet augue quis tellus. Praesent mattis, massa quis luctus fermentum, turpis mi volutpat justo, eu volutpat enim diam eget metus.

Blockquotes

Lorem ipsum dolor sit amet, test link adipiscing elit. Nullam dignissim convallis est. Quisque aliquam.

List Types

Ordered Lists

  1. Item one
    1. sub item one
    2. sub item two
    3. sub item three
  2. Item two

Unordered Lists

  • Item one
  • Item two
  • Item three

Tables

Header1 Header2 Header3
cell1 cell2 cell3
cell4 cell5 cell6
cell1 cell2 cell3
cell4 cell5 cell6
Foot1 Foot2 Foot3

Code Snippets

Syntax highlighting via Rouge

#container {
  float: left;
  margin: 0 -240px 0 0;
  width: 100%;
}

Non Pygments code example

<div id="awesome">
    <p>This is great isn't it?</p>
</div>

Buttons

Make any link standout more when applying the .btn class.

<a href="#" class="btn btn-success">Success Button</a>
Primary Button
Success Button
Warning Button
Danger Button
Info Button