일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- JavaScript
- Close
- package
- 리뷰
- mutex
- channel
- window
- FOR
- Callback
- File
- http
- GO 언어
- bitcoin
- tcp
- go
- Sync
- Golang
- Python
- c++
- API
- json
- range
- install
- windows
- 책
- 영화
- go언어
- C
- Linux
- write
- Today
- Total
목록전체 글 (203)
Code Habit
Go 언어는 패키지를 만들면서 문서화도 할 수 있다. 다음과 같이 calc 패키지의 Sum 함수에 대한 설명을 작성한다. // 계산 패키지 package calc // 두 정수를 더함 func Sum(a int, b int) int { return a + b } package 키워드와 함수 정의 바로 위에 // 주석 형태로 함수 설명을 작성한다. // 주석을 여러 줄로 작성해도 된다. 다음과 같이 GOPATH 디렉터리에서 godoc 명령을 실행해 패키지 및 함수 정보를 출력할 수 있다. ~GOPATH$ godoc calc PACKAGE DOCUMENTATION package calc import "calc" 계산 패키지 FUNCTIONS func Sum(a int, b int) int 두 정수를 더함 g..
사용자 정의 패키지를 만들어 재사용 가능한 컴포넌트를 만들어 사용할 수 있다. 패키지를 만들기 전에 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' 명령을 실행한다...
Go 패키지 Go는 패키지(Package)를 통해 코드의 모듈화, 코드의 재사용 기능을 제공한다. Go는 패키지를 사용해서 작은 단위의 컴포넌트를 작성하고, 이러한 작은 패키지들을 활용해서 프로그램을 작성할 것을 권장한다. Go는 실제 프로그램 개발에 필요한 많은 패키지들을 표준 라이브러리로 제공하고 이러한 표준 라이브러리 패키지들은 GOROOT/pkg안에 존재한다. GOROOT 환경변수는 Go 설치 디렉토리를 가리키는데, 보통 Go 설치시 자동으로 추가된다. 윈도우에서는 Go를 설치했을 경우 디폴트로 C:\go에 설치되며, GOROOT는 C:\go를 가리킨다. Go에 사용하는 표준패키지는 https://golang.org/pkg에 에 자세히 설명되어 있다. Main 패키지 일반적으로 패키지는 라이브러리..
리플렉션은 실행시점(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..
원자적 연산은 더 이상 쪼갤 수 없는 연산이라는 뜻이다. 따라서 여러 스레드(고루틴), CPU코어에서 같은 변수(메모리)를 수정할 때 서로 영향을 받지 않고 안전하게 연산할 수 있다. 보통 원자적 연산은 CPU의 명령어를 직접 사용하여 구현되어 있다. 사용 예제이다. package main import { "fmt" "runtime" "sync" "sync/atomic" } func main() { runtime.GOMAXPROCS(runtime.NumCPU()) // 모든 CPU 사용 var data int32 = 0 wg := new(sync.WaitGroup) for i:=0; i
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