일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- range
- http
- c++
- go언어
- JavaScript
- install
- mutex
- window
- Close
- write
- tcp
- API
- C
- package
- 리뷰
- channel
- Golang
- 책
- Sync
- Python
- json
- bitcoin
- go
- 영화
- GO 언어
- Callback
- Linux
- windows
- File
- Today
- Total
목록go (56)
Code Habit
Go언어는 "net/http" 패키지를 통해 편리하게 HTTP서버를 만들 수 있다. func ListenAndServe(addr string, handler Handler) error : 웹 서버를 시작한다. func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) : 경로별로 요청을 처리할 핸들러 함수 등록 type Employee struct { No int Age int Name string } func MakeWebHandler() http.Handler { mux := http.NewServeMux() mux.HandleFunc("/Employee", EmployeeHandler) return mux } func Employ..
해당 원칙은 상위 타입의 객체를 하위 타입의 객체로 치환해도 동작에 문제가 없어야 한다는 것을 정의한다. 자식 클래스 언제나 자신의 부모클래스를 교체할 수 있어야 하고 한 객체를 다른 객체가 파생하더라도 그 기본 로직은 변경 되어서는 안된다. 리스포크 치환 원칙은 부모 객체와 이를 상속한 자식 객체가 있을 때 부모 객체를 호출하는 동작에서 자식 객체가 부모 객체를 완전히 대체할 수 있다는 원칙이다. type T interface { SomeThing() } type S struct { } func (s *S) SomeThing() { fmt.Println("type S의 Something") } type U struct { } func (u *U) SomeThing() { fmt.Println("type..
컨텍스트(context)는 context 패키지에서 제공하는 기능으로 작업을 지시할 때 작업 가능 시간, 작업 취소 등의 조건을 지시할 수 있는 작업 명세서 역할을 합니다. 새로운 고루틴으로 작업을 시작할 때 일정 시간 동안만 작업을 지시하거나 외부에서 작업을 취소할 때 사용한다. 또한 작업 설정에 관한 데이터를 전달할 수도 있다. var wg sync.WaitGroup func main() { wg.Add(1) ctx, cancel := context.WithCancel(context.Background()) // 컨텍스트 생성 go PrintEverySecond(ctx) time.Sleep(5 * time.Second) cancel() // 취소 wg.Wait() } func PrintEverySec..
C++ 개발을 하면서 여러 일을 동시에 처리해야 할때 멀티 쓰레드를 사용하여 처리한다. 이때 여러 쓰레드에서 동시에 일을 처리하기 위해 코어에서 쓰레드 사이를 옮겨다니며 컨텍스트 스위칭이 발생하는데 이는 자칫하면 부하를 일으켜 성능 저하를 유발하곤 한다. 하여 Go언어에서는 컨텍스트 스위칭 비용을 절약하기 위해 Go루틴이라는 Go 런타임에서 직접 관리하는 경량쓰레드를 제공한다. Go루틴은 명령을 수행하는 단일 흐름으로 OS 스레드를 이용하는 경량 스레드이다. Go언어는 CPU 코어, OS 스레드, 소루틴을 서로 조율하여 사용해 고루틴을 효율적으로 다룬다. 고루틴을 이용하면 코어와 스레드는 변경되지 않고 오직 고루틴만 옮겨 다니기 때문에 컨텍스트 스위칭이 일어나지 않는다. OS 스레드를 직접 사용하는 다른..
함수 리터럴은 이름 없는 함수로 함수명 없이 함수 타입 변숫값으로 대입되는 함숫값을 의미한다. 함수명이 없기 때문에 함수명으로 직접 함수를 호출할 수 없고 함수 타입 변수로만 호출된다. 이름이 없어 익명 함수라고도 한다. type opFunc func(a, b int) int func getOperator(op string) opFunc { if op == "+" { return func(a, b int) int { return a + b } } else if op == "*" { return func(a, b int) int { return a * b } } else { return nil } } func main() { fn := getOperator("*") result := fn(3, 4) // ..
함수 종료 전에 처리 해야 하는 코드가 있을 때 defer를 사용하면 된다. 파일핸들 반환 등에 사용하면 자칫 OS자원 사용 후 반환하지 않는 실수를 줄일 수 있다. func main() { f, err := os.Create("test.txt") if err != nil { fmt.Println("Failed to create file") return } defer fmt.Println("defer 1 !") defer fmt.Println("defer 2 !") defer f.Close() // main() 함수 종료 직전에 실행하여 파일 핸들 반환한다. defer fmt.Println("defer 3 !") } // 출력 순서 defer 3 ! // f.close() 실행 defer 2 ! defe..
fmt.Println()과 같이 함수 인수 개수가 고정적이지 않은 함수를 가변 인수 함수라고 한다. 가변 인수 함수는 '...' 키워드를 이용하여 만들 수 있다. func sum(args ...int) int { var sum = 0 for _, v := range args { sum += v } println("합계 : ", sum) return sum } func main() { sum(1, 2, 3, 4, 5, 6) } int형 가변 인수를 받는 함수 sum()을 정의하고 int형 변수들을 인수로 넘겨준다. 빈 인터페이스 interface{}를 이용하면 여러타입의 인수를 받을 수 있다. ( 모든 타입은 빈 인터페이스 interface{}를 포함한다.) func func1(args ...interfa..
for 반복문에서 range 키워드를 이용하여 배열/슬라이스 요소를 순회할 수 있다. func main() { var t []int = [5]int{1, 2, 3, 4, 5} for i, v = range t {// i : index( 0 ~ 4 ), v : value( 1 ~ 5 ) fmt.Println(i, v) } } for range 구문을 사용하여 채널에서 데이터를 계속 기다릴 수 있다. func main() { var wg sync.WaitGroup wg.Add(1) ch := make(chan int) go func() { defer wg.Done() for n := range ch { // ch에 값이 들어올때까지 대기, 채널을 닫으면 (close(ch)) for 구문을 빠져나온다. fmt..