본문 바로가기

Go 언어 공부

(11)
[GO 마스터하기] 09-동시성2 package main import ( "fmt" "os" "strconv" "sync" ) func main() { numGR, _ := strconv.Atoi(os.Args[1]) var waitGroup sync.WaitGroup var i int k := make(map[int]int) k[1] = 12 for i = 0; i < numGR; i++ { waitGroup.Add(1) go func() { defer waitGroup.Done() k[i] = i }() } k[2] = 10 waitGroup.Wait() fmt.Printf("k = %#v\n", k) }Go 스케줄러 스케줄러는 현재 사용할 수 있는 리소스만으로 처리할 수 있는 일의 양을 효율적으로 분산하는 역할을 담당한다. Go 런..
[GO 마스터하기] 09-동시성 1 Go에서는 goroutine과 channel이라는 기능을 통해 동시성을 지원한다. 고루틴은 Go 프로그램에서 독립적으로 실행할 수 있는 최소 단위이다. 채널을 통해 고루틴 끼리 데이터를 효율적으로 데이터를 주고 받을 수 있다. 따라서 채널은 고루틴끼리 통신하기 위한 참조점인셈이다. Go 프로그램에서 실행되는 부분은 모두 고루틴으로 처리한다. 프로세스, 스레드, Goroutine 프로세스란 명령어와 사용자 데이터, 시스템 영역, 그리고 실행 과정에 수집한 다양한 종류의 리소스로 구성된 독립적인 실행 단위다. 반면 프로그램은 이러한 프로세스의 명령어와 사용자 데이터를 초기화하는 데 사용할 명령어와 데이터를 담은 파일이다. 스레드는 프로그램이나 프로세스보다 좀 더 가볍고 작은 실행단위다. 스레드는 프로세스에 ..
[GO 마스터하기] 08-유닉스 시스템콜 본래 Go는 시스템 프로그래밍 언어의 아쉬운 점을 해결하기 위해 개발되었다. 유닉스 프로세스 프로세스란 일종의 실행 환경ㅇ로서, 명령어, 사용자 데이터, 시스템 데이터, 그리고 실행 시간 동안 얻게 되는 다양한 종류의 리소스로 구성된다. 프로그램은 프로세스에 초기화할 명령와 사용자 데이터로 구성된 바이너리 파일이다. 프로세스는 크게 세 종류로 나눌수 있다. 유저 프로세스는 user space에서 실행되며 특수한 접근 구너한을 가지지 않은 경우가 대부분이다. 커널 프로세스는 kernel space에서만 실행되며, 모든 커널 데이터 구조체에 대한 완전한 접근 권한을 가지고 있다. 데몬 프로세스는 사용자 영역에서 실행되는 프로그램으로, 터미널과 상화 작용하지 않고 백그라운드에서 구동된다. flag 패키지 플래..
[GO 마스터하기] 07-리플렉션과 인터페이스 타입 메소드 타입 메소드란 특수한 수신자 인수를 받는 함수다. 매개변수는 함수와 여기에 추가한 매개변수의 타입을 연결한다. 이러한 매개변수를 메소드의 수신자라 부른다. func (f *File) Close() error { if err := f.checkValid("close"); err != nil { return err } return f.file.close() } Close()는 타입 메소드다. f 매개변수가 메소드의 수신자다. 수신자의 작동 과정을 oop용어로 표현하면 오브젝트에 메세지를 보냈다고 말한다. package main import "fmt" type twoInts struct { X int64 Y int64 } func regularFunction(a, b twoInts) twoInts..
[GO 마스터하기] 06-Go Package Go Package Go에서 모든 것은 패키지 형태로 제공된다. 패키지는 Go로 작성된 소스 파일로, package 키워드 뒤에 패키지 이름을 적은 문장으로 시작된다. 패키지는 주로 서로 관련된 함수나 변수나 상수끼리 그룹으로 묶는데 활용된다. 주의할 점은 main 패키지를 제외한 다른 모든 패키지는 독립적인 프로그램이 아니여서 실행 파일 형태로 컴파일할 수 없다. 익명 함수 익명 함수는 따로 이름을 붙이지 않고 코드 안에서 정의한다. Go에서 함수는 익명 함수를 리턴할 수도, 매개변수로 받을 수도 있다. 또한 익명 함수를 변수에 연결할 수 있다. 함수형 프로그래밍에서는 이러한 익명 하수를 클로저라고 부른다. 리턴값에 이름 붙이기 이름있는 리턴값으로 선언된 함수에서 return문에 아무런 인수도 지정하지..
[GO 마스터하기] 05-Go 자료구조 이진트리 이진트리는 각 노드마다 최대 두개의 자식 노드를 가진다. 루트부터 리프까지의 최대 거리와 최소 거리의 차이가 1 이하이면 균형이 잡혔다고 표현한다. 균형을 잡는 작업은 다소 까다롭고 속도도 느리기 때문에, 노드의 수가 많을수록 균형을 잡은 상태로 만들기 시작하는 것이 좋다. package main import ( "fmt" "math/rand" "time" ) type Tree struct { Left *Tree Value int Right *Tree } func traverse(t *Tree) { if t == nil { return } traverse(t.Left) fmt.Print(t.Value, " ") traverse(t.Right) } func create(n int) *Tree { ..
[GO 마스터하기] 04-합성 타입 사용법 구조체 type aStructure struct { person string height int weight int } 구조체 리터럴은 다음과 같이 정의할 수 있다. 두번째 방법은 모든 필드를 초기화 하지 않아도 된다. p1 := aStructure{"fmt", 12, -2} p1 := aStructure{weight:12, height: -2} package main import "fmt" func main() { type XYZ struct { X int Y int Z int } var s1 XYZ fmt.Println(s1.Y, s1.Z) p1 := XYZ{23, 12, -2} p2 := XYZ{Z: 12, Y: 13} fmt.Println(p1) fmt.Println(p2) pSlice := [4..
[GO 마스터하기] 03-Go언어의 기본 데이터 타입 Go 언어의 루프 Go 언어에서는 for 루프를 사용해 순환 반복 구문을 프로그래밍할 수 있다. for 루프 for i := 0; i < 100; i++ { } 이 루프문을 보면, i는 0부터 99까지의 값을 받는다. 여기서 i는 지역 변수이자 임시 변수로서, for 루프가 종료된 후에는 일정한 시점에 가비지 컬렉션되어 사라진다. 하지만 i를 for 루프 밖에 정의하였다면 for 뤂프가 종료된 후에도 값을 그대로 유지한다. 위의 코드에서는 루프가 종료 후 i는 100이된다. while 루프 Go 언어는 while 키워드를 직접 제공하지 않으나 for 루프를 이용해 while 루프를 작성할 수 있다. for { } do while문도 표현이 가능하다 for ok := true; ok; ok = 표현식 { ..
[GO 마스터하기] 02-Go언어 내부 살펴보기 Go 컴파일러 Go 컴파일러는 go 커맨드로 실행한다. 이 커맨드는 단순히 실행 파일을 생성하는데 그치지 않고 상당히 많은 일을 한다 Go 언어로 작성된 소스 파일을 컴파일하려면 go tool compile 커맨드를 실행한다. 그러면 object file이 생성되며, 확장자는 .o다. 오브젝트 파일은 일종의 바이너리 파일로서 오브젝트 코드를 담고 있다. 이는 재배치 할 수 있는 포맷으로 된 기게어로서, 대부분의 경우 이 상태로 직접 실행하지 않는다. 이렇게 재배치 가능한 포맷으로 생성함으로써 얻을 수 있는 가장 큰 장점은, 링크 단계에서 차지하는 메모리 공간을 최소화할 수 있다는 점이다. go tool compile을 실행할 때 -pack 플래그를 지정하면 오브젝트 파일이 아닌 아카이브 파일이 생성된다 ..
[GO 마스터하기] 01-Go 언어와 운영 체제 Go 언어를 배우는 이유 G는 최신 프로그래밍 언어로 자잘한 버그가 발생할 걱정 없이 코드를 안전하게 작성할 수 있다. Go 언어는 많은 개발자들을 즐겁게 해주기 위한 목적으로 설계되었기 때문에, 코드를 작성하기 쉽다. Go 언어 장점 Go 코드는 읽고 이해하기 쉽다 최대한 개발자를 즐겁게 해주려고 한다. 컴파일러는 문제 해결에 꼭 필요한 경고와 에러 메시만 출력한다. 이식성이 뛰어나다 절차형, 동시성, 분산 프로그래밍을 지원한다. Garbage Collection을 지원한다. 전처리기를 사용하지 않아 컴파일 속도가 빠르다 정적 링크를 사용하여 생성된 바이너리 파일을 생성한다. 그러하여 해당 바이너리를 실행하는데 필요한 라이브러니나 의존성을 신경 쓸 필요 없다. 유니코드를 지원한다. Go 언어 단점 OO..