일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- http
- package
- range
- C
- tcp
- channel
- 영화
- JavaScript
- API
- window
- Sync
- go
- Callback
- write
- bitcoin
- 책
- FOR
- go언어
- Python
- Close
- Golang
- c++
- File
- install
- Linux
- 리뷰
- windows
- GO 언어
- mutex
- json
- Today
- Total
목록분류 전체보기 (203)
Code Habit
Go언어는 클래스를 제공하지 않으므로 상속 또한 제공하지 않는다. 하지만 구조체에서 임베딩(Embedding)을 사용하면 상속과 같은 효과를 낼 수 있다. 먼저 간단하게 Has-a 관계를 정의해 보겠다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 type Person struct { // 사람 구조체 정의 name string age int } func(p *Person) greeting() { // greeting 함수 Person구조체에 연결 fmt.Println("Hello") } type Student struct { p Person // 학생 구조체 안에 사람 구조체를 필드로 가지고 있음( Has - a ) school string grade int }..
Go 언어에는 클래스가 없는 대신 구조체에 메서드를 연결할 수 있다. func (변수명 *구조체타입) 함수명() 리턴값자료형 {} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 type Rectangle struct { width int height int } func (rect *Rectangle) area() int { // rect : 구조체 변수 정의 (연결할 구조체 지정) return rect.width * rect.height // rect. : 구조체 변수를 사용하여 구조체에 접근할 수 있음 } func main() { rect := Rectangle{10, 20} fmt.Println(rect.area()) // 200 : Rectangle 구조체에 연결된 area() 함수를 ..
GDI+를 사용하여 편리하게 이미지를 출력할 수 있다. WM_PAINT 호출 함수( OnPaint )에서 사용 예제이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 CPaintDC dc( m_hWnd ); CDC mDC; CBitmap mBitmap; CBitmap mBitmap_old; CRect rect; GetClientRect(&rect); // 메모리 DC, 비트맵 생성 ( 더블 버퍼링 ) mDC.CreateCompatibleDC( dc ); mBitmap.CreateCompatibleBitmap(dc, rect.right, rect.bottom); mBitmap_old = mDC.SelectBitmap(mBitmap); //..
Go 언어에서 구조체는 다음과 같이 선언할 수 있다. - type 구조체명 struct {} type Rectangle struct { width int height int } 구조체 타입으로 인스턴스는 다음과 같이 생성한다. - var 변수명 구조체타입 var rect Rectangle 여기서 구조체의 각 필드는 해당 자료형의 기본 값으로 초기화 된다. string은 "", unit는 0, float32는 0.0으로 초기화된다. 지역 변수 형태가 아닌 포인터에 메모리 공간을 할당할 수도 있다. - 구조체포인터 = new(구조체타입) var rect1 *Rectangle // 구조체 포인터 선언 rect1 = new(Rectangle) // 구조체 포인터에 메모리 할당 rect2 := new(Rectan..
Go 언어는 C, C++와 마찬가지로 메모리 주소를 표현하는 포인터를 지원한다. var 변수명 *자료형 var numPtr *int // 포인터형 변수를 선언하면 nil로 초기화됨 fmt.Println(numPtr) // nil C 언어와는 달리 *(Asterisk, 애스터리스크)를 자료형 앞에 붙인다. 그리고 포인터형 변수를 선언하면 nil로 초기화된다. ※ Go 언어는 NULL 값을 nil로 사용한다. 단 C 언어에서 NULL이 정수 0으로 정의되어 있지만 Go 언어에서 nil은 숫자 0이 아니다. 빈 포인터형 변수는 바로 사용할 수 없으므로 new 함수로 메모리를 할당해야 한다. 포인터 변수 = new(자료형) var numPtr *int = new(int) fmt.Println(numPtr) //..
프로그램이 잘못되어 에러가 발생한 뒤 종료되는 상황을 패닉이라고 한다. a := [...]int{1, 2} for i := 0; i < 3; i++ { // i는 0, 1, 2 까지 증가 fmt.Println(a[i]) // 배열의 인덱스는 0, 1까지만 있으므로 } // 배열을 벗어난 접근을 하게 됨 // 실행 결과 1 2 panic: runtime error : index out of range 잘못된 부분으로 인해 발생하는 Go 언어 런타임 에러뿐만 아니라 panic 함수를 사용하면 사용자가 직접 에러를 발생시킬 수도 있다. panic(에러 메시지) func main() { panic("Error !!") fmt.Println("Hello, world!") // 실행되지 않음 } // 실행 결과 p..
지연 호출은 특정 함수를 현재 함수가 끝나기 직전에 실행하는 기능이다. 다른 언어의 try-finally 구문과 비슷하게 동작하지만 문법이 좀 더 간단하다. defer 함수명() 사용 예제이다. package main import "fmt" func hello() { fmt.Println("Hello") } func world() { fmt.Println("world") } func main() { defer world() // 현재 함수(main)가 끝나기 직전에 호출 hello() hello() hello() } 출력 결과 : Hello Hello Hello world 다음은 함수 안에 익명 함수를 선언 및 정의하고 지연 호출하는 예제이다. func HelloWorld() { defer func() ..
클로저는 함수 안에서 함수를 선언 및 정의할 수 있고, 바깥쪽 함수에 선언된 변수에도 접근할 수 있는 함수를 말한다. func main() { a, b := 3, 5 f := func(x int) int { return a*x + b // 함수 바깥의 변수 a, b 사용 } y := f(5) fmt.Println(y) // 20 } 다음은 클로저를 사용하는 이유이다. func calc() func(x int) int { a, b := 3, 5 // 지역 변수는 함수가 끝나면 소멸되지만 return func(x int) int { return a*x + b // 클로저이므로 함수를 호출할 때마다 변수 a와 b의 값을 사용할 수 있음 } } func main() { f := calc() // calc함수를 ..