|
1장 Go: 시작은 쉽지만 마스터하긴 어렵다
__1.1 고 언어의 개요 __1.2 단순하다고 쉬운 것은 아니다 __1.3 고 프로그래밍에서 저지르기 쉬운 100가지 실수 ____1.3.1 버그 ____1.3.2 과도한 복잡도 ____1.3.3 낮은 가독성 ____1.3.4 최적이 아니거나 관례에 어긋난 구성 ____1.3.5 API 편의성 부족 ____1.3.6 최적화되지 않은 코드 ____1.3.7 생산성 부족 __1.4 요약 2장 코드와 프로젝트 구성 __2.1 [#1] 의도하지 않은 변수 가림을 조심하라 __2.2 [#2] 필요 이상으로 코드를 중첩하지 마라 __2.3 [#3] init 함수를 잘못 사용하지 마라 ____2.3.1 개념 ____2.3.2 init 함수를 사용해야 하는 경우 __2.4 [#4] 게터와 세터를 남용하지 마라 __2.5 [#5] 인터페이스 오염을 조심하라 ____2.5.1 개념 ____2.5.2 인터페이스를 사용해야 하는 경우 ____2.5.3 인터페이스 오염 __2.6 [#6] 제공자 측에 인터페이스를 두지 마라 __2.7 [#7] 인터페이스를 리턴하지 마라 __2.8 [#8] any는 아무것도 알려주지 않는다 __2.9 [#9] 제네릭이 필요한 시점을 파악하라 ____2.9.1 개념 ____2.9.2 주요 사용 사례와 잘못 사용하는 경우 __2.10 [#10] 타입 임베딩을 제대로 하라 __2.11 [#11] 함수형 옵션 패턴을 사용하라 ____2.11.1 Config 구조체 ____2.11.2 빌더 패턴 ____2.11.3 함수형 옵션 패턴 __2.12 [#12] 프로젝트를 제대로 구성하라 ____2.12.1 프로젝트 구조 ____2.12.2 패키지 구성 __2.13 [#13] 유틸리티 패키지 생성 관련 실수 __2.14 [#14] 패키지 이름 충돌 관련 실수 __2.15 [#15] 코드 문서화 관련 실수 __2.16 [#16] 린터를 활용하라 __2.17 요약 3장 데이터 타입 __3.1 [#17] 8진수 리터럴을 명확하게 표기하라 __3.2 [#18] 정수 오버플로를 무시하지 마라 ____3.2.1 개념 ____3.2.2 값 증가 연산에서 발생하는 정수 오버플로 잡아내기 ____3.2.3 덧셈 연산에서 발생하는 정수 오버플로 잡아내기 ____3.2.4 곱셈 연산에서 발생하는 정수 오버플로 잡아내기 __3.3 [#19] 부동 소수점을 정확하게 이해하라 __3.4 [#20] 슬라이스의 길이와 용량을 정확하게 이해하라 __3.5 [#21] 비효율적인 슬라이스 초기화 관련 실수 __3.6 [#22] nil과 빈 슬라이스를 혼동하지 마라 __3.7 [#23] 슬라이스가 비었는지 제대로 확인하라 __3.8 [#24] 부정확한 슬라이스 복제 관련 실수 __3.9 [#25] 슬라이스 append 연산과 관련된 예상치 못한 부작용 __3.10 [#26] 슬라이스와 메모리 누수 관련 실수 ____3.10.1 용량 누수 ____3.10.2 슬라이스와 포인터 __3.11 [#27] 비효율적인 맵 초기화 관련 실수 ____3.11.1 개념 ____3.11.2 초기화 __3.12 [#28] 맵과 메모리 누수 관련 실수 __3.13 [#29] 값을 올바르게 비교하라 __3.14 요약 4장 제어 구문 __4.1 [#30] range 루프에서 원소가 복제되는 특성을 정확하게 이해하라 ____4.1.1 개념 ____4.1.2 값 복제 __4.2 [#31] range 루프에서 인수를 평가하는 방법을 정확하게 이해하라 ____4.2.1 채널 ____4.2.2 배열 __4.3 [#32] range 루프에서 포인터 원소 사용 시의 실수 __4.4 [#33] 맵 반복 과정에서의 잘못된 가정 ____4.4.1 순서 ____4.4.2 반복 과정에서 맵 업데이트 __4.5 [#34] break문 작동 방식을 정확하게 이해하라 __4.6 [#35] 루프 안에서 defer 사용 시의 실수 __4.7 요약 5장 스트링 __5.1 [#36] 룬 개념을 정확하게 이해하라 __5.2 [#37] 부정확한 스트링 반복 관련 실수 __5.3 [#38] 트림 함수를 잘못 사용하지 마라 __5.4 [#39] 최적화가 덜 된 스트링을 결합하지 마라 __5.5 [#40] 불필요한 스트링 변환 관련 실수 __5.6 [#41] 서브스트링과 메모리 누수 관련 실수 __5.7 요약 6장 함수와 메서드 __6.1 [#42] 적합한 리시버 타입을 결정하라 __6.2 [#43] 기명 결과 매개변수를 적절히 사용하라 __6.3 [#44] 기명 결과 매개변수 사용 시 의도하지 않은 부작용에 주의하라 __6.4 [#45] nil 리시버 리턴 관련 실수 __6.5 [#46] 함수 입력으로 파일 이름을 받지 마라 __6.6 [#47] defer 인수와 리시버 평가 방식을 무시하지 마라 ____6.6.1 인수 평가 ____6.6.2 포인터와 값 리시버 __6.7 요약 7장 에러 관리 __7.1 [#48] 패닉 발생 관련 실수 __7.2 [#49] 에러 포장 여부를 잘 판단하라 __7.3 [#50] 에러 타입을 정확하게 검사하라 __7.4 [#51] 에러 값을 정확하게 검사하라 __7.5 [#52] 에러를 두 번 처리하지 마라 __7.6 [#53] 때로는 에러를 무시하라 __7.7 [#54] defer에서 발생한 에러를 처리하라 __7.8 요약 8장 동시성: 기본 개념 __8.1 [#55] 동시성과 병렬성을 헷갈리지 마라 __8.2 [#56] 동시성이 무조건 빠르다고 착각하지 마라 ____8.2.1 고 언어의 스케줄링 ____8.2.2 병렬 병합 정렬 __8.3 [#57] 채널과 뮤텍스 중 적합한 것을 판단하라 __8.4 [#58] 경쟁 문제에 대해 완전히 이해하라 ____8.4.1 데이터 경쟁과 경쟁 상태 ____8.4.2 고 메모리 모델 __8.5 [#59] 워크로드 타입에 따른 동시성 영향을 정확하게 이해하라 __8.6 [#60] 고 컨텍스트 개념을 정확하게 이해하라 ____8.6.1 데드라인 ____8.6.2 취소 시그널 ____8.6.3 컨텍스트 값 ____8.6.4 컨텍스트 취소 감지하기 __8.7 요약 9장 동시성: 응용 __9.1 [#61] 부적절한 컨텍스트를 전파하지 마라 __9.2 [#62] 멈출 계획 없이 고루틴을 시작하지 마라 __9.3 [#63] 고루틴과 루프 변수를 제대로 다뤄라 __9.4 [#64] select와 채널을 사용하면서 결정론적으로 실행되길 바라지 마라 __9.5 [#65] 알림 채널을 사용하라 __9.6 [#66] 닐 채널을 활용하라 __9.7 [#67] 채널 크기를 제대로 설정하라 __9.8 [#68] 스트링 포맷팅 관련 부작용을 망각하지 마라 ____9.8.1 etcd 데이터 경쟁 ____9.8.2 데드락 __9.9 [#69] append에서 데이터 경쟁을 발생시키지 마라 __9.10 [#70] 슬라이스와 맵에 뮤텍스를 잘 적용하라 __9.11 [#71] sync.WaitGroup을 잘 사용하라 __9.12 [#72] sync.Cond를 잘 활용하라 __9.13 [#73] errgroup을 활용하라 __9.14 [#74] sync 타입을 복제하지 마라 __9.15 요약 10장 표준 라이브러리 __10.1 [#75] 시간 간격을 정확하게 지정하라 __10.2 [#76] 흔히 저지르는 time.After와 메모리 누수 관련 실수 __10.3 [#77] 흔히 저지르는 JSON 처리 과정의 실수 ____10.3.1 타입 임베딩에 의한 이상 동작 ____10.3.2 JSON과 단조 시계 ____10.3.3 any 타입 맵 __10.4 [#78] 흔히 저지르는 SQL 관련 실수 ____10.4.1 sql.Open이 데이터베이스에 대한 연결을 보장하지 않는다는 사실 잊기 ____10.4.2 연결 풀 만드는 것 잊기 ____10.4.3 프리페어드 스테이트먼트 사용하지 않기 ____10.4.4 널 값 잘못 처리하기 ____10.4.5 행 반복 과정에서 발생하는 에러 처리하지 않기 __10.5 [#79] 단기 리소스를 닫아라 ____10.5.1 HTTP 바디 ____10.5.2 sql.Rows ____10.5.3 os.File __10.6 [#80] HTTP 요청에 응답한 후에는 return문을 넣어라 __10.7 [#81] 디폴트 HTTP 클라이언트와 서버를 사용하지 마라 ____10.7.1 HTTP 클라이언트 ____10.7.2 HTTP 서버 __10.8 요약 11장 테스팅 __11.1 [#82] 테스트를 분류하라 ____11.1.1 빌드 태그 ____11.1.2 환경 변수 ____11.1.3 쇼트 모드 __11.2 [#83] -race 플래그를 켜라 __11.3 [#84] 테스트 실행 모드를 사용하라 ____11.3.1 -parallel 플래그 ____11.3.2 -shuffle 플래그 __11.4 [#85] 테이블 중심 테스트를 사용하라 __11.5 [#86] 단위 테스트에서 Sleep을 사용할 때 주의하라 __11.6 [#87] time API를 효율적으로 다뤄라 __11.7 [#88] 테스팅 유틸리티 패키지를 사용하라 ____11.7.1 httptest 패키지 ____11.7.2 iotest 패키지 __11.8 [#89] 벤치마크를 정확하게 작성하라 ____11.8.1 타이머 재설정 또는 일시 정지하지 않기 ____11.8.2 마이크로 벤치마크의 결론 잘못 내리기 ____11.8.3 컴파일러 최적화 동작에 주의하지 않기 ____11.8.4 관측자 효과에 속기 __11.9 [#90] 고 언어의 모든 테스팅 관련 기능을 파악하라 ____11.9.1 코드 커버리지 ____11.9.2 다른 패키지에서 테스트하기 ____11.9.3 유틸리티 함수 ____11.9.4 설정과 해제 __11.10 요약 12장 최적화 __12.1 [#91] CPU 캐시에 대해 완전히 이해하라 ____12.1.1 CPU 아키텍처 ____12.1.2 캐시 라인 ____12.1.3 구조체 슬라이스와 슬라이스 구조체 ____12.1.4 예측 가능성 ____12.1.5 캐시 교체 정책 __12.2 [#92] 거짓 공유가 발생하는 동시성 코드를 작성하지 마라 __12.3 [#93] 인스트럭션 수준의 병렬성을 고려하라 __12.4 [#94] 데이터 정렬을 인지하라 __12.5 [#95] 스택과 힙의 차이에 대해 완전히 이해하라 ____12.5.1 스택과 힙 ____12.5.2 탈출 분석 __12.6 [#96] 할당을 줄이는 방법을 배워라 ____12.6.1 API 변경 ____12.6.2 컴파일러 최적화 ____12.6.3 sync.Pool __12.7 [#97] 인라이닝에 의존하지 마라 __12.8 [#98] 고 진단 도구를 활용하라 ____12.8.1 프로파일링 ____12.8.2 실행 트레이서 __12.9 [#99] GC 작동 방식에 대해 완전히 이해하라 ____12.9.1 개념 ____12.9.2 예제 __12.10 [#100] 도커와 쿠버네티스 환경에서 고 프로그램을 구동할 때 미치는 영향을 이해하라 __12.11 요약 __12.12 마지막으로 남기는 말 |