PySet은 아주 유용한 자료구조이다. 이를 Go로 Go스럽게 구현하기 위해 CPython의 소스코드와 golang 소스코드를 살펴보았다. set과 map이 뒤에서 어떻게 작동하는지를 살펴보고 가장 합리적인 방법으로 집합을 구현해보려 한다. 문제 Python에는 집합이라는 아주 유용한 구조가 있다. set 객체는 크게 2가지 역할이 있는데, 중복 값을 제거하는 것과 빠르게 값을 탐색하는 것이다. n = [1, 3, 3, 5, 6, 3, 8] n = set(n) print(n) # {1, 3, 5, 6, 8} has_three = (3 in n) print(has_three) # True 하지만 Go는 set을 제공하지 않는다. 따라서 set과 유사하게 작동하는 객체를 만들어보려 한다. 그런데 Go를 곁들..
자료의 공간 확보: Slice, Map에 cap 설정하기 빠른 입력: 입력 방식 변경으로 속도 17x 이상 향상 문자열 합치기: Builder를 이용해 속도 71x 이상 향상 정규 표현식: 직접 구현으로 속도 2.6x 이상 향상 함수 인라인 ( < v1.17) 자료의 공간 확보 s := make([]int, 100) // 슬라이스, len: 100, cap: 100 s[i] = val // 값 대입 s := make([]int, 0, 100) // 슬라이스, len: 0, cap: 100 s = append(s, val) // 값 대입 Slice를 생성할 때, 해당 Slice에 저장될 값의 범위를 알 수 있다면 미리 메모리에 공간을 확보하는 것이 유리하다. make는 slice의 형식을 입력받은 후, l..
Go의 표준 입출력은 fmt 패키지를 사용한다. package main import "fmt" func main() { var num int fmt.Scan(&num) // 입력 fmt.Print(num) // 출력 } 하지만 위와 같은 방식의 표준 입출력은 속도가 느리다. 만약 코딩 테스트를 푼다면 문제에 따라 시간 초과의 원인이 될 수도 있다. bufio Reader를 이용한 빠른 입출력 import ( "bufio" "fmt" "os" ) var reader = bufio.NewReader(os.Stdin) var writer = bufio.NewWriter(os.Stdout) func main() { defer writer.Flush() var num int fmt.Fscan(reader, &nu..
함수 Generic Go도 1.18 버전부터 Generic을 지원하기 시작했다. func 함수명[T any](n T) T {...} 함수명 뒤에 [ ]를 통해 제너릭을 선언할 수 있다. any는 모든 타입을 뜻하며, comparable은 ==, != 비교가 가능한 타입을 의미한다. 그 외 정의된 타입의 키워드(string, int...)들을 사용할 수 있다. func Power[T int | float64](n T) T { return n * n } |(OR)을 이용해 여러 타입을 작성할 수 있다. type Number interface { int | int16 | int32 | int64 | float32 | float64 } func Power[T Number](n T) T { return n * n..
Go는 testing을 통해 테스트 코드 작성을 지원한다. 테스트를 수행할 테스트 파일은 _test.go 형식의 파일 이름을 가져야 한다. (예: cv_test.go) import "testing" Test func Test함수이름(t *testing.T) { res := 함수(...) if res != 결과 { t.Errorf("...") } } 테스트를 수행할 함수는 Test로 시작하고, *testing.T를 파라미터로 받는다. 예: func RepeatAdd(n int) int { i := 0 for j := 1; j
Asynchronous Non-blocking 작업 - Synchronous vs Asynchronous - Blocking vs Non-Blocking - Asynchronous Non-blocking Request Sync / Async 두 항목을 나누는 기준은 요청한 작업이 진행되는 순서이다. Synchronous - 동기: 요청된 작업이.. denev6.tistory.com 위 글에서 설명했듯이 비동기 처리는 속도와 효율성 면에서 큰 이점을 가진다. 그리고 Go는 이러한 비동기 루틴 실행을 아주아주아주 쉽게 할 수 있다. Go 루틴 Go의 루틴은 2KB 스택 공간만을 사용하기 때문에 가볍고, 하나의 코어 당 하나의 OS 스레드만 할당하기 때문에 스레드의 컨텍스트 스위칭 비용이 발생하지 않는다. g..