Go 100가지 실수 패턴과 솔루션 : 고 언어의 이해도와 숙련도를 높이는 실전 사례와 구체적인 예제

Go 100가지 실수 패턴과 솔루션 : 고 언어의 이해도와 숙련도를 높이는 실전 사례와 구체적인 예제

$36.39
저자

테이바하사니

저자:테이바하사니(TeivaHarsanyi)

도커에서시니어소프트웨어엔지니어로근무하고있다.보험,운송,항공교통관리와같은안전필수(safety-critical)시스템을비롯한다양한분야에서일해왔다.고언어와애플리케이션을신뢰성있게설계하고구현하는방법에매우관심이많다.

-트위터:@teivah



역자:남기혁

고려대학교컴퓨터학과에서학부와석사과정을마친후한국전자통신연구원에서선임연구원으로재직하고있으며,현재㈜프리스티에서네트워크제어및검증소프트웨어개발업무를맡고있다.『GWT구글웹툴킷』(2008),『해킹초보를위한USB공격과방어』(2011),『자바7의새로운기능』(2013),『iOS해킹과보안가이드』(2014),『Neutron오픈스택네트워킹』(2015),『실전IoT네트워크프로그래밍』(2015),『애플워치WatchKit프로그래밍』(2015),『현대네트워크기초이론』(2016),『도커컨테이너』(2017),『스마트IoT프로젝트』(2017),『파이썬으로배우는인공지능』(2017),『메이커를위한실전모터가이드』(2018),『트러블슈팅도커』(2018),『Go마스터하기』(2018)등을번역했다.

목차

1장Go:시작은쉽지만마스터하긴어렵다
__1.1고언어의개요
__1.2단순하다고쉬운것은아니다
__1.3고프로그래밍에서저지르기쉬운100가지실수
____1.3.1버그
____1.3.2과도한복잡도
____1.3.3낮은가독성
____1.3.4최적이아니거나관례에어긋난구성
____1.3.5API편의성부족
____1.3.6최적화되지않은코드
____1.3.7생산성부족
__1.4요약

2장코드와프로젝트구성
__2.1[#1]의도하지않은변수가림을조심하라
__2.2[#2]필요이상으로코드를중첩하지마라
__2.3[#3]init함수를잘못사용하지마라
____2.3.1개념
____2.3.2init함수를사용해야하는경우
__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.1Config구조체
____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.1etcd데이터경쟁
____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.2JSON과단조시계
____10.3.3any타입맵
__10.4[#78]흔히저지르는SQL관련실수
____10.4.1sql.Open이데이터베이스에대한연결을보장하지않는다는사실잊기
____10.4.2연결풀만드는것잊기
____10.4.3프리페어드스테이트먼트사용하지않기
____10.4.4널값잘못처리하기
____10.4.5행반복과정에서발생하는에러처리하지않기
__10.5[#79]단기리소스를닫아라
____10.5.1HTTP바디
____10.5.2sql.Rows
____10.5.3os.File
__10.6[#80]HTTP요청에응답한후에는return문을넣어라
__10.7[#81]디폴트HTTP클라이언트와서버를사용하지마라
____10.7.1HTTP클라이언트
____10.7.2HTTP서버
__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]timeAPI를효율적으로다뤄라
__11.7[#88]테스팅유틸리티패키지를사용하라
____11.7.1httptest패키지
____11.7.2iotest패키지
__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.1CPU아키텍처
____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.1API변경
____12.6.2컴파일러최적화
____12.6.3sync.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마지막으로남기는말

찾아보기

출판사 서평

『EffectiveJava』에상당하는Go책이다.
Go개발자가반드시읽어야할책!니라지샤,WayfairCEO

고프로젝트과정에서가장많이저지르는100가지실수에대해적절한예제와실수를해결하는다양한방법을함께제시했다.흔히저지르는실수를패턴화하여익히는것은효율적인방법이다.여기에구체적인예제를곁들이면쉽고빠르게배울수있을뿐만아니라,실수를저지르는상황을기억했다가나중에좀더효과적으로피할수있다.또한,각실수마다최대한실전사례를함께제시하여자세히설명하므로,실수가어떻게발생하는지왜놓치기쉬운지를근본적으로이해하고,고언어를더깊은수준에서이해할수있다.중요한것은실수로부터배울수있는우리의역량이다.이책은고애플리케이션의성능과개발자의역량을함께향상시킬수있는,고개발자를위한필독서다.

[다루는내용]
1장Go:시작은쉽지만마스터하긴어렵다·이책에서다룰다양한실수유형소개
2장코드와프로젝트구성·관례를따르면서깔끔하게코드를구성하는데방해되는실수
3장데이터타입·기본데이터타입과슬라이스,맵에관련된실수
4장제어구문·루프와같은제어구문에서흔히저지르는실수
5장스트링·스트링표현원칙과코드를부정확하고비효율적으로만드는실수
6장함수와메서드·함수/메서드에서흔히발생하는문제(리시버타입선정,defer버그방지등)
7장에러관리·에러를관례에맞게제대로처리하는방법
8장동시성:기본개념·동시성기본개념(동시성의빠르기,동시성과병렬성차이,워크로드타입등)
9장동시성:응용·채널과고루틴을비롯한동시성기본요소를활용할때저지르는실수
10장표준라이브러리·HTTP,JSPN,timeAPI등에서흔히저지르는실수
11장테스팅·테스트와벤치마크를수행할때효과와정확도를떨어뜨리는실수
12장최적화·애플리케이션의성능을최적화하는방법(CPU기본작동원리,고언어의세부기능등)

[지은이서문]

2019년,내경력의두번째고언어프로젝트를진행하던당시,고프로그래밍과정중흔히저지르는실수에서일정한패턴이있음을발견했다.발견한패턴을글로남겨두면다른개발자에게도움이될수있겠다고생각했다.그렇게해서나온글이“고프로젝트과정에서가장많이저지르는10가지실수(TheTop10MostCommonMistakesI’veSeeninGoProjects)”라는블로그포스트다.조회수는10만을넘었고고랭위클리(GolangWeekly)뉴스레터에2019년최고의글로선정됐을뿐더러커뮤니티에서긍정적인피드백을받아서기분이좋았다.그때부터흔히저지르는실수패턴의강력함을깨달았다.그리고업무상직·간접적으로겪은프로젝트,오픈소스리포지터리,책,블로그,연구자료,고커뮤니티토론등을비롯한다양한소스로부터실수사례를거의일년동안수집했다.100가지실수에적절한예제와이를해결하는다양한방법을곁들이도록구성하는작업을수없이반복했다.아무쪼록이책을통해여러분이실수를피하고고언어를숙달하는데도움이되길바란다.

[옮긴이서문]

시스템소프트웨어개발경험이풍부해야만깨달을수있는노하우가이책한권에잘정리되어있습니다.실전고프로그래밍에굉장히유익한내용으로가득차있어서번역하는입장에서도즐거웠습니다.이책의실습을검증한환경은둘로나눌수있습니다.

(1)시스템독립적인예제의실행환경:GoPlayground
-https://go.dev/play
-예:슬라이스연산등코어기능
-고언어:1.20

(2)시스템종속적인예제의실행환경:Go1.20.5/맥OS(M1)
-프로세서:M1(ARM기반,darwin/arm64)
-운영체제:macOS12.5Monterey
-예:I/O,고루틴성능비교등
-고언어:1.20.5