일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- Callback
- bitcoin
- File
- window
- 영화
- Golang
- json
- 책
- c++
- API
- go언어
- windows
- tcp
- JavaScript
- install
- GO 언어
- Python
- Sync
- range
- C
- mutex
- write
- FOR
- package
- channel
- go
- Linux
- Close
- Today
- Total
목록go (56)
Code Habit
"container/list" 패키지를 사용하면 go에서 연결리스트를 사용할 수 있다. 다음은 "container/list"에서 연결리스트를 사용하기 위해 제공하는 함수이다. func New() *List: 연결 리스트 생성 func (I *List) PushBack(v interface{}) *Element : 맨 뒤에 노드 추가 func (I *List) PushFront(v interface{}) *Element : 맨 앞에 노드 추가 func (I *List) PushBackList(other* List) : 맨 뒤에 다른 리스트를 붙임 func (I *List) PushFrontList(other* List) : 맨 앞에 다른 리스트를 붙임 func (I *List) InsertAfter(v i..
사용자 정의 패키지를 만들어 재사용 가능한 컴포넌트를 만들어 사용할 수 있다. 패키지를 만들기 전에 GOPATH부터 설정해야 하고 GOPATH/src 안에 디렉토리를 생성해 그 안에 만들어 준다. 디렉토리 이름은 패키지 이름과 동일하게 만들어야 하며 .go 소스 파일명은 꼭 같지 않아도 된다. 다음 내용을 GOPATH/src/calc/sum.go 파일로 저장한다. package calc func Sum(a int, b int) int { return a + b } 패키지 안의 함수 이름의 첫글자를 대문자로 지정해야 public으로 외부에서 사용할 수 있다. 패키지를 컴파일 하여 라이브러리로 만들려면 패키지가 들어있는 디렉토리로 이동해(GOPATH/src/calc) 'go install' 명령을 실행한다...
리플렉션은 실행시점(Runtime, 런타임)에 인터페이스나 구조체 등의 타입 정보를 얻어내거나 결정하는 기능이다. package main import { "fmt" "reflect" } type Data struct { // 구조체 정의 a, b int } func main() { var num int = 1 fmt.Println(reflect.TypeOf(num)) // int var s string = "Hello, world!" fmt.Println(reflect.TypeOf(s)) // string var f float32 = 1.3 fmt.Println(reflect.TypeOf(f)) // float32 var data Data = Data{1, 2} fmt.Println(reflect.Typ..
go 언어는 sync패키지의 WaitGroup을 통해 대기 그룹을 제공한다. 대기 그룹은 고루틴이 끝날때까지 대기한다. sync 패키지에서 제공하는 대기 그룹의 구조체와 함수는 다음과 같다. sync.WaitGroup func (wg *WaitGroup) Add(delta int) : 대기 그룹에 고루틴 개수 추가 func (wg *WaitGroup) Done(): 고루틴이 끝났다는 것을 알려줄 때 사용 func (wg *WaitGroup) Wait(): 모든 고루틴이 끝날 때까지 기다림 package main import { "fmt" "runtime" "sync" } func main() { runtime.GOMAXPROCS(runtime.NumCPU()) // 모든 CPU 사용 wg := new(s..
풀은 객체(메모리)를 사용한 후 보관해두었다가 다시 사용하게 해주는 기능이다. 객체를 반복해서 할당하면 메모리 사용량도 늘어나고, 메모리를 해제해야 하는 가비지 컬렉터에게도 부담이 된다. 즉 풀은 일종의 캐시라고 할 수 있으며 메모리 할당과 해제 횟수를 줄여 성능을 높이고자 할 때 사용한다. 그리고 풀은 여러 고루틴에서 동시에 사용할 수 있다. Sync 패키지에서 제공하는 풀의 구조체와 함수는 다음과 같다. sync.Pool func (p *Pool) Get() interface{} : 풀에 보관된 객체를 가져옴 func (p *Pool) Put(x interface{}) : 풀에 객체를 보관 사용 예제이다. package main import ( "fmt" "math/rand" "runtime" "sy..
Once를 사용하면 함수를 한 번만 실행할 수 있다. Sync 패키지에서 제공하는 Once의 구조체와 함수는 다음과 같다. Sync.Once func (*Once) Do(f func()) : 함수를 한번만 실행 사용예제이다. package main import ( "fmt" "runtime" "sync" ) func hello() { fmt.Println("Hello, world!") } func main() { runtime.GOMAXPROCS(runtime.NumCPU()) // 모든 CPU 사용 once := new(sync.Once) // Once 생성 for i := 0; i
읽기, 쓰기 뮤텍스는 읽기 동작과 쓰기 동작을 나누어 잠금(락)을 걸 수 있다. 읽기 락(Read Lock): 읽기 락끼리는 서로를 막지 않는다. 하지만, 읽기 시도 중에 값이 바뀌면 안 되므로 쓰기 락은 막는다. 쓰기 락(Write Lock): 쓰기 시도 중에 다른 곳에서 이전 값을 읽으면 안 되고, 다른 곳에서 값을 바꾸면 안 되므로 읽기, 쓰기 락 모두 막는다. sync 패키지에서 제공하는 읽기, 쓰기 뮤텍스 구조체와 함수는 다음과 같다. sync.RWMutex func(rw *RWMutex) Lock(), / func(rw* RWMutex) Unlock(); 쓰기 뮤텍스 잠금 / 잠금 해제 func(rw *RWMutex) RLock(), / func(rw *RWMutex) RUnlock(); 읽기..
뮤텍스는 여러 고루틴이 공유하는 데이터를 보호할 때 사용하며 sync 패키지에서 제공하는 뮤텍스 구조체와 함수는 다음과 같다. sync.Mutex func (m *Mutex) Lock(): 뮤텍스 잠금 func (m *Mutex) Unlock(): 뮤텍스 잠금 해제 사용예제이다. 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 package main import ( "fmt" "runtime" "sync" "time" ) func main() { runtime.GOMAXPROCS(runtime.NumCPU()) // 모든 CPU 사용 var data = []int{}..