Top

Go 마스터하기 2/e [동시성, 네트워크, 머신러닝, 컴파일러 등 고급 기능의 실습과 활용]

  • 원서명Mastering Go: Create Golang production applications using network libraries, concurrency, machine learning, and advanced data structures, 2nd Edition (ISBN 9781838559335)
  • 지은이미할리스 추칼로스(Mihalis Tsoukalos)
  • 옮긴이남기혁
  • ISBN : 9791161755311
  • 50,000원
  • 2021년 06월 10일 펴냄
  • 페이퍼백 | 1,020쪽 | 188*235mm
  • 시리즈 : acorn+PACKT, 프로그래밍 언어

책 소개

소스 코드 파일은 여기에서 내려 받으실 수 있습니다.
https://github.com/AcornPublishing/mastering-go-2e

본문에 쓰인 컬러 이미지는 여기에서 내려 받으세요.
요약

Go 언어의 기본 개념부터 동시성, 네트워크, 머신러닝, 고급 데이터 구조에 이르기까지 방대한 주제를 실습 예제와 함께 소개한다. 1판의 내용 중 도커와 쿠버네티스, 깃, 웹어셈블리, JSON, gRPC 등을 보강했으며, 머신러닝 관련 내용을 새롭게 추가했다. 이 책을 통해 Go 언어의 기초뿐만 아니라, 실전에서 활용할 수 있는 다양한 기술을 배울 수 있다. Go 언어를 제대로 배우고 싶다면 이 책은 전문가 수준에 이르기 위한 필독서다.

이 책에서 다루는 내용

■ 실전에서 Go 언어를 활용하는 방법
■ Go의 내부 작동 과정과 언어 설계 당시 고려 사항, Go 코드 최적화 방법
■ Go 데이터 타입, 복합 타입, 데이터 구조에 대한 완벽 가이드
■ Go 언어를 제대로 사용하기 위한 패키지, 리플렉션, 인터페이스
■ 서버 사이드, 클라이언트 사이드 애플리케이션을 비롯한 네트워킹 기능을 사용하는 고성능 시스템 구현 방법
■ 웹어셈블리, JSON, gRPC를 이용해 다른 시스템과 상호작용하는 방법
■ 안정적이고 동시성을 지원하는 고성능 코드
■ 간단한 통계 기법부터 복잡한 신경망에 이르는 머신러닝 시스템을 구현하는 방법

이 책의 대상 독자

초급 개발자부터 Go 언어에 대한 지식을 좀 더 넓히고 싶은 중급 프로그래머를 대상으로 하는 책이다. 다른 언어에 대한 경험이 풍부한 개발자들이 for 루프 작성법과 같은 기초부터 볼 필요 없이 곧바로 Go 언어를 익힐 수 있게 배려했다. 이 책에서 소개하는 내용 중 일부는 나의 다른 저서인 『Go Systems Programming』(Packt, 2017)에서도 다룬다. 두 책의 가장 큰 차이점은 『Go Systems Programming』이 Go 언어의 기능을 활용해 시스템 도구를 개발하는 데 초점을 맞춘 반면 이 책은 Go 프로그래머로서 한 단계 더 올라서는 데 필요한 Go 언어의 다양한 기능과 내부 작동 원리를 소개하는 데 주안점을 둔 점이다. 두 책 모두 한두 번 읽고 나서도 참고서로 활용하기 좋다.

이 책의 구성

1장, ‘Go와 OS’에서는 Go 언어의 역사와 장점부터 소개한다. 그런 다음 godoc 유틸리티를 설명하고, Go 프로그램을 컴파일하고 실행하는 방법을 소개한다. 이어서 화면에 출력하는 방법과 사용자로부터 입력받는 방법, 프로그램에서 커맨드라인 인수를 처리하는 방법, 로그 파일을 다루는 방법 등을 소개한다. 마지막으로 Go 언어에서 굉장히 중요한 역할을 하는 에러 처리 기법을 소개한다.
2장, ‘Go 내부’에서는 Go 언어의 가비지 컬렉터의 개념과 작동 원리를 소개한다. 그런 다음 unsafe 패키지, Go 프로그램에서 C 코드를 호출하는 방법, C 프로그램에서 Go 코드를 호출하는 방법을 살펴본다. 이어서 defer 키워드를 사용하는 방법, strace(1)과 dtrace(1) 유틸리티 사용법을 소개한다. Go 환경의 정보를 조회하는 방법, Go 어셈블러를 사용하는 방법, Go에서 웹어셈블리를 생성하는 방법도 설명한다.
3장, ‘기본 타입’에서는 Go 언어에서 제공하는 다양한 데이터 타입을 소개한다. 이 과정에서 배열, 슬라이스, 맵뿐만 아니라 포인터, 상수, 루프, 날짜와 시간을 다루는 방법을 살펴본다.
4장, ‘합성 타입 사용’에서는 먼저 구조체의 개념과 struct 키워드를 소개한 후 튜플, 스트링, 룬, 바이트 슬라이스, 스트링 리터럴 등을 살펴본다. 나머지 부분은 정규 표현식과 패턴 매칭, switch문, strings 패키지, math/big 패키지, 키-값 스토어를 구현하는 방법, XML과 JSON 파일을 다루는 방법을 소개한다.
5장, ‘데이터 구조로 Go 코드 개선’에서는 Go 언어에서 제공하는 구조체만으로는 부족해서 데이터 구조를 직접 정의하는 방법을 소개한다. 이 과정에서 이진트리, 연결 리스트, 해시 테이블, 스택, 큐를 구현하는 방법과 각각의 장단점을 살펴본다. 또한 표준 Go 패키지인 container에서 제공하는 구조체의 사용법도 소개한다. 마지막으로 Go 언어에서 스도쿠 퍼즐을 검증하고 난수를 생성하는 방법도 알아본다. 6장, ‘패키지와 함수’에서는 패키지와 함수, init() 함수 사용법, 표준 Go 패키지인 syscall, text/template, html/template을 소개한다. 또한 go/scanner, go/parser, go/token과 같은 고급 패키지 사용법도 살펴본다.
7장, ‘리플렉션과 인터페이스’에서는 Go 언어의 고급 주제 세 가지인 리플렉션, 인터페이스, type 메서드를 소개한다. 그리고 Go에서 제공하는 객체지향 기능과 Delve를 이용해 Go 프로그램을 디버깅하는 방법도 소개한다.
8장, ‘유닉스 시스템에 작업 지시’에서는 Go 언어로 시스템 프로그래밍을 하는 방법을 소개한다. 이를 위해 flag 패키지로 커맨드라인 인수를 다루는 방법, 유닉스 시그널, 파일 입출력, bytes 패키지, io.Reader와 io.Writer 인터페이스를 다루는 방법, Viper와 Cobra Go 패키지를 사용하는 방법도 소개한다.
9장, ‘Go 언어의 동시성: 고루틴, 채널, 파이프라인’에서는 Go 언어에서 동시성을 제공하기 위한 기능인 고루틴, 채널, 파이프라인을 소개한다. 또한 프로세스, 스레드, 고루틴의 차이점을 설명하고, sync 패키지 사용법과 Go 스케줄러 작동 방식도 소개한다.
10장, ‘Go 언어의 동시성: 고급 주제’에서는 9장에 이어 고루틴과 채널을 사용하는 방법을 집중적으로 소개한다. Go 스케줄러도 깊이 있게 살펴보고 강력한 키워드인 select 사용법과 다양한 타입의 채널, 공유 메모리, 뮤텍스, sync.Mutex 타입, sync.RWMutex 타입 등도 소개한다. 10장의 마지막에서는 context 패키지, 워커 풀, 경쟁 조건 감지 방법 등도 다룬다.
11장, ‘코드 테스팅, 최적화, 프로파일링’에서는 코드 테스팅, 코드 최적화, 코드 프로파일링, 크로스컴파일, 문서화, 벤치마킹, 예제 함수 작성법, 도달하지 않는 코드를 찾는 방법 등을 소개한다.
12장, ‘Go 언어를 이용한 네트워크 프로그래밍의 기초’에서는 net/http 패키지를 사용하는 방법과 Go 언어에서 웹 서버와 웹 클라이언트를 작성하는 방법을 소개한다. 또한 http.Response, http.Request, http.Transport 구조체와 http.NewServeMux 타입을 사용하는 방법도 살펴본다. 그리고 Go 언어로 웹 사이트를 만드는 방법도 소개한다. 또한 네트워크 인터페이스의 설정 사항을 읽고 DNS를 조회하는 방법도 소개하고, 마지막으로 gRPC를 다루는 방법도 알아본다.
13장, ‘네트워크 프로그래밍: 서버와 클라이언트 개발’에서는 Go 언어로 HTTPS 트래픽을 다루는 방법, UDP 및 TCP 클라이언트와 서버를 작성하는 방법, net 패키지에서 제공하는 기능을 활용하는 방법을 소개한다. 그리고 RPC 클라이언트와 서버 작성법, TCP 서버에서 동시성을 지원하도록 작성하는 방법, 원본 패킷을 읽는 방법도 소개한다.
14장, ‘머신러닝’에서는 분류, 클러스터링(군집화), 이상 감지, 아웃라이어, 신경망, 텐서플로와 같은 머신러닝 기법을 구현하는 방법을 소개하고, 아파치 카프카를 다루는 방법도 소개한다.

이 책은 크게 세 부분으로 나눌 수 있다. 첫 번째 부분은 Go 언어의 주요 개념을 깊이 있게 들여다본다. 이러한 개념으로는 사용자 입출력, Go 패키지 다운로드하기, Go 코드 컴파일하기, Go 코드에서 C 코드 호출하기, Go에서 웹어셈블리 생성하기, Go의 기본 타입과 합성 타입 등이 있다. 두 번째 부분은 5장, 6장, 7장으로 구성되며, 패키지와 모듈로 구성하는 방법, Go 프로젝트 설계를 비롯한 고급 기능을 다룬다. 세 번째 부분은 Go 언어에 대한 실용적인 주제를 다룬다. 8장부터 11장까지는 Go 언어를 이용한 시스템 프로그래밍, 동시성, 코드 테스팅, 최적화, 프로파일링을 다룬다. 마지막 세 장은 네트워크 프로그래밍과 머신러닝을 소개한다. 이 책은 웹어셈블리, 도커 다루기, Viper와 Cobra 패키지로 전문적인 커맨드라인 도구를 생성하는 방법, JSON과 YAML 파싱하기, 행렬 연산하기, 스도쿠 퍼즐 다루기, go/scanner와 go/token 패키지 사용법, git(1)과 깃허브 사용법, atomic 패키지, gRPC와 HTTPS를 다루는 방법 등도 소개한다.

  • 이 책은 각 장에서 소개하는 개념을 담은, 작지만 완전한 형태의 예제 프로그램도 함께 제공한다. 이렇게 하면 크게 두 가지 장점이 있다. 하나는 한 가지 기법을 배우려고 복잡한 코드를 들여다볼 필요가 없다는 것이다. 다른 하나는 이 코드를 토대로 나만의 애플리케이션을 만들 수 있다는 것이다.

  • 이 책에서는 컨테이너와 도커의 중요성을 반영해 도커 이미지에서 사용하는 Go 실행 파일 예제도 다양하게 제공한다. 도커 이미지는 서버 소프트웨어를 배포하는 데 뛰어난 수단을 제공하기 때문이다.

저자/역자 소개

지은이의 말

지금 읽고 있는 책은 뛰어난 Go 언어 개발자가 되게 도와주기 위한 책이다.
2판에는 Go 언어로 머신러닝을 구현하는 방법과 Viper, Cobra Go 패키지, gRPC, 도커 이미지 다루기, YAML 파일 다루기, go/scanner와 go/token 패키지 사용법, 웹어셈블리 코드 생성하기를 비롯해서 1판에는 없던 내용이 새롭게 추가됐다.
Go 프로그래밍 언어는 미래의 고성능 시스템용 언어다. 흔히 고랭(Golang)이라고도 부르는데, 공식 명칭은 아니다. 이 책은 선풍적인 인기를 얻은 초판을 개선해서 생산성 높은 고급 Go 프로그래머로 성장하는 데 도움을 주고자 집필했다. 이 책에서는 Go 언어를 실전에서 활용하는 방법을 제시한다. Go 언어의 기초를 아는 독자라면 이 책의 예제 및 패턴과 명쾌한 설명으로 Go의 능력을 더욱 키우고 현업에 적용할 수 있을 것이다. Go 언어에서의 타입과 구조체, 패키지, 동시성, 네트워크 프로그래밍, 컴파일러 설계, 최적화를 비롯한 깊이 있는 주제를 다양하게 다룬다. 각 장마다 연습문제와 참고 자료를 제공해 새로 배운 내용을 확실히 다질 수 있다.

지은이 소개

미할리스 추칼로스(Mihalis Tsoukalos)

기술서 저자이자 유닉스 관리자, 프로그래머, DBA, 수학자로, 기술서적이나 칼럼 쓰기와 새로운 것 배우기를 좋아한다. 『Go Systems Programming』(Packt, 2017)과 『Go 마스터하기』(에이콘, 2018)의 저자로, 지금까지 'Sys Admin', 'MacTech', 'Linux User and Developer', 'Usenix ;login:', 'Linux Format', 'Linux Journal'을 비롯한 여러 저널에 250여 편을 기고했다. 주요 관심분야는 데이터베이스, 시각화, 통계, 머신러닝이다. http://www.mtsoukalos.eu/와 @mactsouk에서 직접 만나볼 수 있으며, 사진가로도 활동하고 있다.

옮긴이의 말

초판 번역을 한 지 불과 2년이 안 된 지금, 급격히 성장한 Go 언어와 생태계가 놀랍습니다. C, C++, Java, Python을 비롯한 주요 언어의 각자 주력 분야를 제외한 나머지 영역을 Go가 하나둘씩 빼가는 느낌입니다. 그래서 이 책처럼 다양한 주제를 실습 예제 위주로 훑어보면 흥미를 유지하면서 꾸준히 Go 언어를 익히기에 좋은 것 같습니다.
이번 번역도 예전 책과 마찬가지로 빠른 이해와 의미 전달에 우선순위를 뒀습니다. 변화의 속도에 발맞추기가 중요한 만큼 빠른 이해를 위해 의도적으로 음차 표기를 선택한 용어도 많습니다. 그래서 독자 입장에서 아쉬운 부분은 얼마든지 나올 수 있다는 점에 대해 미리 양해를 구합니다.

옮긴이 소개

남기혁

고려대 컴퓨터학과에서 학부와 석사 과정을 마친 후 한국전자통신연구원에서 선임연구원으로 재직하고 있다. 한빛미디어에서 출간한 『Make: 센서』(2015), 『메이커 매뉴얼』(2016), 『이펙티브 디버깅』(2017), 『전문가를 위한 C++』(2019), 『리팩토링 2판』(2020)과 에이콘출판사에서 출간한 『현대 네트워크 기초 이론』(2016), 『도커 컨테이너』(2017), 『스마트 IoT 프로젝트』(2017), 『파이썬으로 배우는 인공지능』(2017), 『메이커를 위한 실전 모터 가이드』(2018), 『Go 마스터하기』(2018), 『자율주행 자동차 만들기』(2018), 『The Hundred-Page Machine Learning Book』(2019), 『스콧 애론슨의 양자 컴퓨팅 강의』(2021), 『자율주행차량 기술 입문』(2021) 등을 번역했다.

목차

목차
  • 1장. Go와 OS
    • Go 언어의 역사
    • Go 현황
    • Go 언어의 장점
      • Go 언어는 완벽한가?
        • 전처리기란?
      • godoc 유틸리티
    • Go 코드 컴파일
    • Go 코드 실행
    • Go 언어의 두 가지 규칙
      • 사용할 패키지만 임포트
      • 중괄호 작성 방식
    • Go 패키지 다운로드
    • 유닉스 stdin, stdout, stderr
    • 화면에 출력
    • 표준 출력 사용
    • 사용자 입력받기
      • :=와 =
      • 표준 입력으로 읽기
      • 커맨드라인 인수 다루기
    • 에러 출력 방법
    • 로그 파일 작성
      • 로그 수준
      • 로그 종류
      • 로그 서버
      • 로그 파일로 정보를 보내는 Go 프로그램
      • log.Fatal()
      • log.Panic()
      • 커스텀 로그 파일 작성
      • 로그 항목에 줄번호 출력
    • Go 언어에서 에러 처리
      • error 데이터 타입
      • 에러 처리
    • 도커 사용
    • 참고 자료
    • 연습문제
    • 요약

  • 2장. Go 내부
    • Go 컴파일러
    • 가비지 컬렉션
      • 삼색 알고리즘
      • Go 언어에서 가비지 컬렉터의 구체적인 작동 방식
      • 가비지 컬렉터에서 주의해야 할 맵과 슬라이스 연산
        • 슬라이스 사용
        • 맵에 포인터 사용
        • 맵에 포인터가 아닌 값 사용
        • 맵 나누기
        • 예제 성능 비교
      • 언세이프 코드
      • unsafe 패키지
      • unsafe 패키지에 대한 또 다른 예제
      • Go에서 C 코드 호출
      • 같은 파일에 작성한 C 코드 호출
      • 다른 파일에 작성한 C 코드 호출
      • C 코드
      • Go 코드
      • Go 코드와 C 코드 합치기
    • C 코드에서 Go 함수 호출
      • Go 패키지
      • C 코드
    • defer 키워드
      • 로깅에 defer 사용
    • panic 함수와 recover 함수
      • panic 함수만 사용
    • 두 가지 유용한 유닉스 유틸리티
      • strace
      • dtrace
    • Go 환경 파악
    • go env 명령
    • Go 어셈블러
    • 노드 트리
    • go build에 대해 좀 더 살펴보기
    • 웹어셈블리 코드 생성
      • 웹어셈블리의 간단한 소개
      • 웹어셈블리가 중요한 이유
      • Go와 웹어셈블리
      • 웹어셈블리 생성 방법
      • 생성된 웹어셈블리 코드 사용
    • Go 프로그래밍 관련 팁
    • 참고 자료
    • 연습문제
    • 요약

  • 3장. 기본 타입
    • 숫자 타입
      • 정수
      • 부동소수점 수
      • 복소수
      • Go 2의 숫자 리터럴
    • Go 루프
      • for 루프
      • while 루프
      • range 키워드
      • Go의 다양한 루프문
    • Go 배열
      • 다차원 배열
      • Go 배열의 단점
    • Go 슬라이스
      • 슬라이스에 대한 기본 연산
      • 슬라이스는 자동으로 확장된다
      • 바이트 슬라이스
      • copy() 함수
      • 다차원 슬라이스
      • 다차원 슬라이스 예제
      • sort.Slice()로 슬라이스 정렬
      • 슬라이스에 배열 추가
      • nil 맵에 저장
      • 맵을 사용해야 할 때
    • Go 상수
      • 상수 생성자 iota
    • Go 포인터
      • 포인터를 사용하는 이유
    • 날짜와 시간
      • 시간 처리
      • 시간 파싱
      • 날짜 처리
      • 날짜 파싱
      • 날짜와 시간 포맷 변경
    • 실행 시간 측정
      • Go 가비지 컬렉터 실행 시간 측정
    • 참고 자료
    • 연습문제
    • 요약

  • 4장. 합성 타입 사용
    • 합성 타입
    • 구조체
      • 구조체에 대한 포인터
      • new 키워드 사용
    • 튜플
    • 정규 표현식과 패턴 매칭
      • 정규 표현식에 관련된 몇 가지 이론
      • 간단한 예제
      • 좀 더 어려운 예제
      • IPv4 주소 매칭
    • 스트링
      • 룬이란?
      • unicode 패키지
      • strings 패키지
    • switch문
    • 파이 값 정확하게 계산
    • Go 언어로 키-값 스토어 구현
    • Go와 JSON
      • JSON 데이터 읽기
      • JSON 데이터 저장
      • Marshal()과 Unmarshal()
      • JSON 데이터 파싱
      • Go와 XML
      • XML 읽기
      • XML 출력 커스터마이즈
    • Go와 YAML 포맷
    • 참고 자료
    • 연습문제
    • 요약

  • 5장. 데이터 구조로 Go 코드 개선
    • 그래프와 노드
    • 알고리즘 복잡도
    • Go 언어에서의 이진트리
      • Go 언어로 이진트리 구현
      • 이진트리의 장점
    • 해시 테이블
      • Go 언어로 해시 테이블 구현
      • 검색 기능 구현
      • 해시 테이블의 장점
    • 연결 리스트
      • 연결 리스트 구현
      • 연결 리스트의 장점
    • 이중 연결 리스트
      • 이중 연결 리스트 구현
    • 이중 연결 리스트의 장점
      • Go에서의 큐
    • 큐 구현
    • Go에서의 스택
      • 스택 구현
    • container 패키지
      • container/heap 사용법
      • container/list 사용법
      • container/ring 사용법
    • 난수 생성
      • 무작위 스트링 생성
    • 보안에 안전한 유사 난수 생성
    • 행렬 계산
      • 행렬 덧셈과 뺄셈
      • 행렬 곱셈
      • 행렬 나눗셈
        • 배열의 크기를 알아내는 방법
    • 수도쿠 퍼즐 풀기
    • 참고 자료
    • 연습문제
    • 요약

  • 6장. 패키지와 함수
    • Go 패키지
    • Go 언어의 함수
      • 익명 함수
      • 여러 값을 리턴하는 함수
      • 함수의 리턴 값에도 이름을 붙일 수 있다
      • 포인터를 매개변수로 받는 함수
      • 포인터를 리턴하는 함수
      • 함수를 리턴하는 함수
      • 함수를 매개변수로 받는 함수
      • 가변 인수 함수
    • Go 패키지 직접 만들기
      • Go 패키지 컴파일
      • 사설 변수와 함수
      • init() 함수
    • Go 모듈
      • Go 모듈 생성과 사용
        • 버전 v1.0.0 생성
        • 버전 v1.0.0 사용
        • v1.1.0 생성
        • v1.1.0 버전 사용
        • v2.0.0 버전 생성
        • v2.0.0 버전 사용
        • v2.1.0 생성
        • v2.1.0 버전 사용
      • Go 모듈을 두 가지 버전으로 사용
      • Go 모듈이 저장되는 위치
      • go mod vendor 명령
    • Go 패키지를 잘 만드는 방법
    • syscall 패키지
      • fmt.Println()의 내부 실행 과정
    • go/scanner, go/parser, go/token 패키지
      • go/ast 패키지
      • go/scanner 패키지
      • go/parser 패키지
      • 현실적인 예제
      • 스트링 길이를 입력받아 변수 이름 검색
    • 텍스트와 HTML 템플릿
      • 텍스트 출력 생성
      • HTML 출력
    • 기본적인 SQLite3 명령
    • 참고 자료
    • 연습문제
    • 요약

  • 7장. 리플렉션과 인터페이스
    • 타입 메서드
    • 인터페이스
      • 타입 어써션
    • 인터페이스 직접 작성
      • Go 인터페이스 사용
      • 인터페이스와 데이터 타입에 대한 switch문 작성법
    • 리플렉션
      • 리플렉션에 대한 간단한 예제
      • 리플렉션에 대한 좀 더 복잡한 예제
      • 리플렉션의 단점 세 가지
      • reflectwalk 라이브러리
    • Go에서의 객체지향 프로그래밍
    • 깃과 깃허브
      • 깃 사용법
        • git status
        • git pull
        • git commit
        • git push
        • 브랜치 작업
        • 파일 다루기
        • .gitignore 파일
        • git diff
        • 태그 다루기
        • git cherry-pick
    • Delve로 디버깅
      • 디버깅 예
    • 참고 자료
    • 연습문제
    • 요약

  • 8장. 유닉스 시스템에 작업 지시
    • 유닉스 프로세스
    • flag 패키지
    • viper 패키지
      • viper를 사용하는 간단한 예
      • flag 사용 코드를 viper 사용 코드로 변경
      • JSON 설정 파일 읽기
      • YAML 설정 파일 읽기
    • cobra 패키지
      • 간단한 cobra 예제
      • 명령 앨리어스 생성
    • io.Reader와 io.Writer 인터페이스
      • 버퍼를 이용한 파일 입출력과 버퍼를 이용하지 않는 파일 입출력
    • bufio 패키지
    • 텍스트 파일 읽기
      • 텍스트 파일을 한 줄씩 읽기
      • 텍스트 파일을 한 단어씩 읽기
      • 텍스트 파일을 한 문자씩 읽기
      • /dev/random 읽기
    • 파일에서 원하는 만큼 읽기
    • 바이너리 포맷의 장점
    • CSV 파일 읽기
    • 파일에 쓰기
    • 디스크에 데이터를 읽거나 쓰기
    • strings 패키지 다시 보기
    • bytes 패키지
    • 파일 접근 권한
    • 유닉스 시그널 처리
      • 두 가지 시그널 처리
      • 모든 종류의 시그널 처리
    • Go에서의 유닉스 파이프
      • Go 언어로 cat(1) 유틸리티 구현
    • syscall.PtraceRegs
    • 시스템 콜 추적
    • 유저 ID와 그룹 ID
    • 도커 API와 Go
    • 참고 자료
    • 연습문제
    • 요약

  • 9장. Go 언어의 동시성: 고루틴, 채널, 파이프라인
    • 프로세스, 스레드, 고루틴
      • Go 스케줄러
      • 동시성과 병렬성
    • 고루틴
      • 고루틴 생성 방법
      • 고루틴 여러 개 생성
    • 고루틴을 마칠 때까지 기다리기
      • Add()와 Done()의 호출 횟수가 일치하지 않은 경우
    • 채널
      • 채널에 데이터 쓰기
      • 채널에서 데이터 읽기
      • 닫힌 채널에서 받기
      • 함수 매개변수로 지정한 채널
    • 파이프라인
    • 경쟁 상태
    • Go와 Rust의 동시성 모델 비교
    • Go와 Erlang의 동시성 모델 비교
    • 참고 자료
    • 연습문제
    • 요약

  • 10장. Go 언어의 동시성: 고급 주제
    • Go 스케줄러 다시 보기
      • GOMAXPROCS 환경 변수
    • select 키워드
    • 고루틴 만료시키기
      • 고루틴을 만료시키기 위한 첫 번째 기법
      • 고루틴을 만료시키기 위한 두 번째 방법
    • Go 채널 다시 보기
      • 시그널 채널
      • 버퍼 채널
      • nil 채널
      • 채널에 대한 채널
      • 고루틴의 실행 순서 지정
      • 고루틴을 사용하면 안 되는 경우
    • 공유 메모리와 공유 변수
      • sync.Mutex
        • 뮤텍스를 언락하는 것을 까먹은 경우
      • sync.RWMutex
      • atomic 패키지
      • 고루틴으로 메모리 공유
    • go문 다시 보기
    • 경쟁 상태 발견
    • context 패키지
      • context 패키지를 이용한 좀 더 복잡한 예제
      • context 패키지의 또 다른 예
      • 워커 풀
    • 참고 자료
    • 연습문제
    • 요약

  • 11장. 코드 테스팅, 최적화, 프로파일링
    • 최적화
    • Go 코드 최적화
    • Go 코드 프로파일링
      • 표준 Go 패키지 net/http/pprof
      • 간단한 프로파일링 예제
      • 좀 더 편리한 외부 패키지로 프로파일링
      • Go 프로파일러의 웹 인터페이스
        • 웹 인터페이스를 이용한 프로파일링 예제
        • 그래피즈 간략 소개
    • go tool trace 유틸리티
    • Go 코드 테스트
      • 기존 코드에 대한 테스트 코드 작성
      • 코드 커버리지 테스트
    • 데이터베이스 백엔드를 갖춘 HTTP 서버 테스트
      • testing/quick 패키지
        • 테스트 실행이 너무 오래 걸리거나 끝나지 않는 경우
    • Go 코드 벤치마킹
    • 간단한 벤치마킹 예제
      • 잘못 작성한 벤치마크 함수의 예
    • 쓰기 버퍼 벤치마킹
    • 실행되지 않는 코드 찾기
    • 크로스컴파일
    • 예제 함수 만들기
    • Go 코드를 머신 코드로 변환
      • Go에서 어셈블리 사용
    • 문서 생성
    • 도커 이미지 사용법
    • 참고 자료
    • 연습문제
    • 요약

  • 12장. Go 언어를 이용한 네트워크 프로그래밍의 기초
    • net/http, net, http.RoundTripper
      • http.Response 타입
      • http.Request 타입
      • http.Transport 타입
    • TCP/IP
    • IPv4와 IPv6
    • nc(1) 커맨드라인 유틸리티
    • 네트워크 인터페이스에서 설정 읽기
    • DNS 룩업
      • 도메인의 NS 레코드 조회
      • 도메인에 대한 MX 레코드 조회
    • Go 언어로 웹 서버 만들기
      • atomic 패키지 사용
      • HTTP 서버 프로파일링
      • Go 언어로 웹 사이트 만들기
    • HTTP 트레이싱
      • HTTP 핸들러 테스트
    • Go 언어로 웹 클라이언트 생성
      • 좀 더 기능이 풍부한 웹 클라이언트 만들기
    • HTTP 연결 타임아웃 지정
      • SetDeadline에 대한 상세한 사항
      • 타임아웃 주기를 서버 측에 설정
      • 또 다른 타임아웃 기법
    • 와이어샤크와 티샤크
    • gRPC
      • 인터페이스 정의 파일 정의
      • gRPC 클라이언트
      • gRPC 서버
    • 참고 자료
    • 연습문제
    • 요약

  • 13장. 네트워크 프로그래밍: 서버와 클라이언트 개발
    • HTTPS 트래픽 다루기
      • 인증서 생성
      • HTTPS 클라이언트
      • 간단한 HTTPS 서버
      • TLS 서버와 클라이언트 개발
    • 표준 Go 패키지 net
    • TCP 클라이언트
      • TCP 클라이언트를 약간 변형한 버전
    • TCP 서버
      • TCP 서버를 약간 변형한 버전
    • UDP 클라이언트
    • UDP 서버 구현
    • 동시성을 지원하는 TCP 서버
      • 동시성을 지원하는 TCP 서버의 또 다른 버전
    • TCP/IP 서버를 구동하는 도커 이미지 생성
    • 원격 프로시저 호출(RPC)
      • RPC 클라이언트
      • RPC 서버
    • 로우레벨 네트워크 프로그래밍
      • 원본 상태의 ICMP 패킷 수집
    • 참고 자료
    • 연습문제
    • 요약

  • 14장. 머신러닝
    • 간단한 통계적 특성 계산
    • 회귀
      • 선형 회귀
      • 선형 회귀 구현
      • 선 그래프 그리기
    • 분류
    • 군집
    • 이상 감지
    • 신경망
    • 아웃라이어 분석
    • 텐서플로
    • 카프카
    • 참고 자료
    • 연습문제
    • 요약
    • 마무리하며

도서 오류 신고

도서 오류 신고

에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

(예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안

정오표

정오표

[p.36 : 5행]
Go 언어는 전처리기를 사용하고
->
Go 언어는 전처리기를 사용하지 않으며

[p.38 : 아래에서 3행]
$ go doc(2) fmt
->
$ go doc fmt

[p.38 : 아래에서 5행]
$ go doc(1) fmt.Printf
->
$ go doc fmt.Printf

[p.161 : 8행]
% GOOS=js GOARCH=wasm go run .(4)
->
% GOOS=js GOARCH=wasm go run .

[p.301 : 8행~9행]
다시 O(n²) 알고리즘보다는 O(n³) 알고리즘의 성능이 뛰어나다는 식으로 비교할 수 있다.
->
다시 O(n²) 알고리즘이 O(n³) 알고리즘보다 성능이 뛰어나다는 식으로 비교할 수 있다.

[p.524 : 10행]
이번에는 설정 파일 경로를 하드코딩하지 않았기 때문에 직접 정의하려고 viper.ConfigFileUsed()를 호출했다.
->
여기서 설정 경로를 하드코딩하지 않았기 때문에 직접 정의하려고 viper.SetConfigName()을 호출했다.

다음으로 readYAML.go의 세 번째 부분을 보자.