일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- FOR
- c++
- channel
- go언어
- mutex
- range
- Sync
- write
- 리뷰
- C
- window
- File
- http
- Callback
- windows
- Linux
- go
- 영화
- Python
- Golang
- API
- package
- JavaScript
- GO 언어
- install
- Close
- tcp
- 책
- bitcoin
- json
- Today
- Total
목록go (56)
Code Habit
지연 호출은 특정 함수를 현재 함수가 끝나기 직전에 실행하는 기능이다. 다른 언어의 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함수를 ..
Go 언어는 다음과 같이 간단하게 함수를 정의하고 호출할 수 있다. func 함수명(){} func hello() { fmt.Println("Hello, world!") } func world() { // 컴파일 에러 fmt.Println("world !"); } func main() { hello() } Go 언어는 함수 정의를 시작한 줄에서 { (여는 중괄호)가 시작된다. 다음 줄에 작성하면 컴파일 에러가 발생한다. ※ Go언어는 함수를 정의할 때 C, C++과 다르게 위치 제약이 없다. 즉 뒤에 정의해도 앞에서 사용할 수 있다. 함수에서 매개변수를 받고 값을 리턴하는 방법을 알아보겠다. func 함수명(매개변수명 자료형) 리턴값 자료형 {} func sum(a int, b int) int { ret..
맵은 키-값 형태로 자료를 저장한다. 또한 슬라이스와 마찬가지로 레퍼런스 타입이다. 다음과 같이 맵을 선언할 수 있다. var 맵명 map[키_자료형]값_자료형 var a map[string]int // 키는 string, 값은 int인 맵 선언 map은 make 함수를 사용하여 공간을 할당해야 값을 넣을 수 있다. // make 함수로 키는 string 값은 int인 맵에 공간할당 var a map[string]int = make(map[string]int) var b = make(map[string]int) c := make(map[string]int) 다음과 같이 map 생성과 동시에 값을 초기화할 수 있다. a := map[string]int{"Hello":10, "world":20} b := m..
슬라이스는 레퍼런스 타입이다. 내장된 배열에 대한 포인터이므로 슬라이스끼리 대입하면 값이 복사되지 않고 참조(레퍼런스)만 한다. a := []int{1, 2, 3} var b []int// 슬라이스로 선언 b = a// a를 b에 대입해도 요소가 모두 복사되지 않고 참조만 함 b[0] = 9// 슬라이스는 참조이므로 a[0], b[0]의 값이 모두 바뀜 fmt.Println(a) // [9 2 3] fmt.Println(b) // [9 2 3] 마찬가지로 함수의 매개변수에 배열을 넘기면 복사가 되지만 슬라이스를 넘기면 참조만 하게 된다. 따라서 함수 안에서 슬라이스의 요소를 변경하면 함수 바깥에 있는 슬라이스도 값이 바뀐다. 슬라이스의 요소를 모두 복사할 때는 copy 함수를 사용한다. copy(복사될 ..
슬라이스는 배열과 같지만 길이가 고정되어 있지 않고 동적으로 크기가 늘어난다. 또한, 배열과는 달리 레퍼런스 타입이다. var 슬라이스명 []자료형 var a []int // int형 슬라이스 선언 슬라이스는 배열과 달리 [](대괄호) 안에 길이를 지정하지 않는다. 이렇게 생성된 슬라이스의 길이는 0이다. 슬라이스는 make 함수를 사용하여 공간을 할당해야 값을 넣을 수 있다. var a []int = make([]int, 5) // make 함수로 int 형에 길이가 5인 슬라이스에 공간 할당 var b = make([]int, 5) // 슬라이스를 선언할 때 자료형과 [] 생략 c := make([]int, 5) // 슬라이스를 선언할 때 var 키워드, 자료형과 [] 생략 슬라이스를 생성하고 공간을..
Go 언어에서 배열은 다음과 같이 사용한다. var 배열명 [길이]자료형 var a [5]int a[2] = 7 fmt.Println(a) // [0 0 7 0 0] 배열을 생성하면서 값을 초기화 하려면 다음과 같이 쓰면 된다. var a [5]int = [5]int{32, 29, 78, 16, 81} // int 형이며 길이가 5인 배열을 선언하고 초기화 var b = [5]int{32, 29, 78, 16, 81} // 배열을 선언할 때 자료형과 길이 생략 c := [5]int{32, 29, 78, 16, 81} // 배열을 선언할 때 var 키워드, 자료형과 길이 생략 ...을 사용하면 초기화할 값의 개수에 따라 자동으로 크기가 설정된다. c := [...]int{32, 29, 78, 16, 81}..
switch 분기문을 사용하면 다양한 조건을 좀 더 간단하게 표현할 수 있다. switch 변수 { case 값1: fmt.Println("case 1") case 값2: fmt.Println("case 2") default: fmt.Println("default") } Go 언어의 switch 분기문은 C와는 달리 case에서 break 키워드를 생략한다. 변수는 숫자뿐 아니라 문자열도 사용할 수 있고 break를 사용하여 문장 실행을 중단할 수도 있다. s := "Hello" switch s { case "Hi": fmt.Println("Hi") case "Hello": fmt.Println("Hello") break; fmt.Println("everyone") } fallthrough 키워드를 사용..