일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- c++
- install
- range
- tcp
- Callback
- mutex
- package
- channel
- FOR
- 리뷰
- File
- JavaScript
- write
- bitcoin
- go언어
- Linux
- Python
- window
- windows
- 책
- API
- go
- Close
- 영화
- GO 언어
- json
- http
- Sync
- C
- Golang
- Today
- Total
목록go (56)
Code Habit
고루틴은 함수를 동시에 실행시키는 기능이다. 스레드보다 문법이 간단하고 리소스를 적게 사용한다. 사용 예제이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 package main import ( "fmt" "math/rand" "time" ) func hello(n int) { r := rand.Intn(100) // 랜덤한 숫자 생성 time.Sleep(time.Duration(r))// 랜덤한 시간 동안 대기 fmt.Println(n) } func main() { for i:=0; i
각 값이나 인스턴스의 실제 타입은 상관하지 않고 구현된 메서드로만 타입을 판단하는 방식을 덕 타이핑(Duck typing)이라 한다. 이는 go 언어에만 국한된 것은 아니고 다른 언어에도 공용되는 개념이다. ex ) c++의 상속개념 사용 예제이다. 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 32 33 34 35 36 37 38 39 40 41 42 43 package main import "fmt" type Duck struct { } func (d Duck) quack() { // 오리의 quack 메서드 정의 fmt.Println("오리 : 꽥 ~ !") } func (d Duck) feath..
인터페이스는 메서드 집합이다. 단 인터페이스는 메서드 자체를 구현하지는 않는다. type 인터페이스명 interface {} 인터페이스 정의 예제이다. 1 2 3 4 5 6 7 8 9 10 11 package main import "fmt" type hello interface { // 인터페이스 정의 } func main() { var h hello // 인터페이스 선언 fmt.Println(h) // nil: 빈 인터페이스이므로 nil이 출력됨 } 메서드를 가지는 인터페이스를 정의해 보자. type 인터페이스명 interface { 메서드 } 인터페이스 활용 예제이다. 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..
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() 함수를 ..
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..