GO 프로그래밍 언어는 구글을 위한 언어로써 개발되었다. Go 1.0의 출시일은 2012년으로 역사가 길지 않지만, 많은 사람들이 사용하고 있는 언어이다. 이제는 tiobe index 11위권까지 올라왔다. Swift와 거의 비슷한 수준이라는 것은 많은 개발자들이 사용하고 있다는 것을 의미한다.
세명의 아키텍쳐가 설계하였는데 그 중의 한 명은 1970년대에 C언어의 창시자 데니스 리치와 함께 UNIX 를 개발한 켄톰슨이다. 43년생인데 2009년에 Go 설계에 참여했다니 엄청나다. 데니스 리치가 말년에 시름시름 앓다가 2011년에 세상을 떠난 것을 보면 데니스 보다 말년이 더 풍족해보인다.
켄톰슨 인터뷰 2019년 유닉스를 시작한 전설의 인물
GO 언어의 특징은 명확해 보인다.
Go는 정적 타입 컴파일 언어의 효율성과 동적 언어처럼 쉬운 프로그래밍을 할 수 있도록 하는 것을 목표로 한다.
안전성 : 타입 안전성과 메모리 안전성
병행성과 통신을 위한 훌륭한 지원
효과적인 가비지 컬렉션
빠른 컴파일
*우선 튜토리얼을 바로 해본다. Caleb Doxsey 의 Go 프로그래밍 책을 번역한 웹페이지를 참고한다.
글쓴이도 처음하는 튜토리얼이다. 처음하는 튜토리얼의 리얼함을 담아 보려고 한다.
코딩은 저 위의 천채들 수준이 아니면 머리로 이해가 힘들다;; 몸으로 체득하는게 더 빠르다.
배움에 왕도가 없으니까 자신에게 제일 잘 맞는 방법, 제일 빠른 방법을 찾는게 중요하다.
코딩도장의 표어 '프로그래밍은 공부가 아닙니다. 연습입니다.'
package main
import "fmt"
func main() {
var x string = "Here we go!"
fmt.Println(x)
var a int = 10
fmt.Println(a)
x = "There you go"
fmt.Println(x)
x = x + " again"
fmt.Println(x)
b := "I love pizza"
fmt.Println(b)
}
package main 을 선언하고 시작한다.
import "fmt" 는 외부 라이브러리를 import 한다. fmt 는 짐작할 수 있듯이 fortmat 의 약자이다.
표준 출력을 Println 으로 사용하는 것으로 보아 표준 출력의 포맷을 관리하는 패키지같다.
자세한 내용은 아래 처럼 cmd 에서 go doc fmt 에 나와있다.
내용이 매우 길기 때문에 궁굼한 부분만 보려면 >go doc fmt.PrintLn 같이 구체적 함수 이름을 입력한다.
함수 Println 은 표준 출력에 오퍼랜드의 내용을 출력한다는 내용이다. 다른 언어에서 많이 봤던 prtint 계열의 함수다.
함수의 사용법에 대해 모를 때 doc 명령어를 쓸 수 있다.
func main() {
var x string = "Here we go!"
fmt.Println(x)
var a int = 10
fmt.Println(a)
x = "There you go"
fmt.Println(x)
var y = "String"
fmt.Println(y)
x = x + " again"
fmt.Println(x)
b := "I love pizza"
fmt.Println(b)
}
func 는 당연히 함수의 약어인 것을 알 것이다. (function) main함수는 많은 언어들에서 시작점으로 갖는다. 프로그램이 로드되고 함수중에 첫번재로 실행된다.
var x string 의 형식으로 변수를 선언한다.
쉬운 프로그래밍을 목적으로 탄생한 언어치고는 타입을 생략하는 파이썬이나 루비에 비하면 조금 까다롭게 느껴진다. 허나 Go는 파이썬 같은 인터프리터가 아니다. 또 var 같은 컴파일러의 추론형도 사용하는 것을 보면 무언가 믹스된 느낌이 든다.
var y = "String"
fmt.Println(y)
b := 같은 문법의 축약형도 제공한다.
*const 키워드는 변수를 상수로 만들어 준다. 이는 변경할 수 없다. C의 키워드 const 와 같다.
package main
import "fmt"
func main() {
const x string = "Yes sir we are ready!" // 변경 불가 contst 형
fmt.Println(string)
}
* 변수를 여러개 정의하는 방법이 따로있다. n1 ~3까지 묶어서 정의한다.
package main
import "fmt"
func main() {
var (
n1 = 3
n2 = 5
n3 = 7
)
fmt.Println(n1, n2, n3)
}
* 아래는 입력받은 숫자를 두배하는 내용이다. float64 (64비트 부동소수점 타입 일거라 추정된다) 니까 실수형을 입력해본다.
package main
import "fmt"
func main() {
fmt.Println("숫자를 입력하시오. ")
var float1 float64
fmt.Scanf("%f", &float1)
dnum1 := float1 * 2
fmt.Println(dnum1)
}
정상적으로 출력된다. Scanf 의 입력방식도 C언어에 많이 닮아 있는 것 같다. 켄 톰슨이 참여해서 그런지는 몰라도 C의 느낌이 많이 난다. 아직 잘 모르겠지만 함수형 프로그램이란 것도 그런 것 같다.
* 변수의 스코프 (Scope) 범위
함수형 프로그램에서는 의외로 OOP보다 간단할 수 있다고 본다. import 다음 줄부터 main 윗줄까지가 전역 변수 공간이다. func new 에서 사용한 x 는 new의 지역변수이다. main 이 사용하는 x는 전역변수 var x int 이다.
package main
import "fmt"
var x int = 10
func main() {
fmt.Println(x) // outside main()
new()
fmt.Println(x)
}
func new() {
var x string = "READy and Go"
fmt.Println(x)
}
결과값을 보면 x의 범위를 알 수 있다. 전역변수 10과 지역면수 string 전역변수 10이 번갈아 나온다. 서로 영향을 주고 받지 않는다는 것이다.
여기까지 아래 웹북을 참고하여 초보자의 튜토리얼을 진행해봤다. 가급적 리얼한 느낌을 가지고 진행을 해봤다.
말 그대로 처음 해보는 과정이라 두서없지만 대부분 다른 언어에서 다루었던 개념을 가지고 이해하려고 했다.
과연 한가지 언어를 배우면 비슷하게 다른 언어도 빨리 이해할 수 있는가? 라는 부분도 의문이다.
전문적인 부분까지는 무리겠지만 이 웹북의 내용까지는 추가로 포스팅 해보려고 한다.