Go 마스터하기 [고급 기능을 활용한 실전 애플리케이션 만들기]
- 원서명Mastering Go: Create Golang production applications using network libraries, concurrency, and advanced Go data structures (ISBN 9781788626545)
- 지은이미할리스 추칼로스(Mihalis Tsoukalos)
- 옮긴이남기혁
- ISBN : 9791161752082
- 40,000원
- 2018년 10월 16일 펴냄
- 페이퍼백 | 776쪽 | 188*235mm
- 시리즈 : acorn+PACKT, 프로그래밍 언어
판매처
개정판책 소개
소스 코드 파일은 여기에서 내려 받으실 수 있습니다.
본문에 쓰인 컬러 이미지는 여기에서 내려 받으세요.
요약
Go 언어의 개론서로 Go 언어의 역사부터 동시성, 시스템 및 네트워크 프로그래밍, 최신 클라우드 개발에 이르기까지 방대한 주제를 깊이 있게 다루고 있다. 이 책을 통해, Go 언어의 설계 철학과 코드 최적화에 도움되는 Go 언어의 내부 원리, 동시성 모델, 시스템 및 네트워킹 코드 작성법, 데이터 타입과 자료구조 활용법 등을 배울 수 있다.
이 책에서 다루는 내용
█ Go 언어의 설계 철학
█ Go 코드를 최적화하는 데 도움되는 Go 언어의 내부 원리
█ Go 언어에서 제공하는 동시성 모델
█ 시스템 및 네트워킹 코드 작성법
█ 모든 환경에 적용할 수 있는 서버 코드
█ Go 언어의 데이터 타입과 자료 구조의 개념과 활용법
이 책의 대상 독자
이 책은 초급 개발자부터 Go 언어에 대한 지식을 좀 더 넓히고 싶은 중급 Go 프로그래머를 대상으로 집필했다. 또한 다른 프로그래밍 언어에 대한 경험이 풍부한 개발자들이 for 루프 작성법과 같은 기초부터 볼 필요 없이 곧바로 Go 언어를 익힐 수 있도록 배려했다.
이 책에서 소개하는 내용 중 일부는 필자의 또 다른 저서인 『Go Systems Programming』(Packt, 2017)에서도 다루고 있다. 두 책의 가장 큰 차이점은 『Go Systems Programming』은 Go 언어의 기능을 활용해 시스템 도구를 개발하는 데 초점을 맞춘 반면, 『Go 마스터하기』는 보다 뛰어난 Go 프로그래머가 되는 데 필요한 Go 언어의 다양한 기능과 내부 작동 원리를 소개하는 데 주안점을 뒀다는 것이다. 두 책 모두 한두 번 읽은 뒤 계속해서 레퍼런스로 활용할 수 있다.
이 책의 구성
1장, ‘Go 언어와 운영 체제’에서는 Go 언어의 역사와 장점부터 소개한다. 그런 다음, godoc 유틸리티에 대해 설명하며 Go 프로그램을 컴파일하고 실행하는 방법을 소개한다. 이어서 화면에 출력하는 방법과 사용자로부터 입력 받는 방법, 프로그램에서 커맨드라인 인수를 처리하는 방법, 로그 파일을 다루는 방법 등을 소개한다. 마지막으로 Go 언어에서 굉장히 중요한 역할을 하는 에러 핸들링 기법을 소개한다.
2장, ‘Go 언어의 내부 구조’에서는 Go 언어의 가비지 컬렉터의 개념과 작동 원리를 소개한다. 그런 다음 unsafe 패키지와 Go 프로그램에서 C 코드를 호출하는 방법, C 프로그램에서 Go 코드를 호출하는 방법을 살펴본다. 이어서 defer 키워드를 사용하는 방법과 strace(1) 및 dtrace(1) 유틸리티 사용법을 소개한다. 이 장의 나머지 부분은 Go 환경에 대한 정보를 조회하는 방법과 Go 어셈블러를 사용하는 방법을 설명한다.
3장, ‘Go 언어의 기본 데이터 타입’에서는 Go 언어에서 제공하는 다양한 데이터 타입을 소개한다. 이 과정에서 배열, 슬라이스, 맵뿐만 아니라 포인터, 상수, 루프, 날짜와 시간을 다루는 방법을 살펴본다. 이 장은 반드시 읽고 넘어가야 할 내용을 다루고 있다.
4장, ‘합성 타입 사용법’에서는 먼저 구조체의 개념과 struct 키워드에 대해 소개한 뒤 튜플, 스트링, 룬, 바이트 슬라이스, 스트링 리터럴 등을 살펴본다. 나머지 부분은 정규 표현식과 패턴 매칭, 스위치문, strings 패키지, math/big 패키지, 그리고 키-값 스토어를 구현하는 방법을 소개한다.
5장, ‘자료 구조로 Go 코드 개선하기’에서는 Go 언어에서 제공하는 구조체만으로 부족할 때 자료 구조를 직접 정의하는 방법을 소개한다. 이 과정에서 이진 트리, 연결 리스트, 해시테이블, 스택, 큐를 구현하는 방법과 각각의 장단점을 살펴본다. 또한 표준 Go 패키지인 container에서 제공하는 구조체의 사용법도 소개한다. 마지막으로 난수 생성 방법을 소개한다.
6장, ‘Go 패키지에 대해 잘 알려지지 않은 사실’에서는 패키지와 함수, init() 함수 사용법, 표준 Go 패키지인 syscall, text/template, html/template에 대해 소개한다. 이 장에서 다루는 내용을 익히면 확실히 실력을 한 단계 높일 수 있다.
7장, ‘리플렉션과 인터페이스’에서는 Go 언어의 세 가지 고급 주제 리플렉션, 인터페이스, type 메소드에 대해 소개한다. Go 언어로 객체 지향 프로그래밍을 하는 방법도 소개한다.
8장, ‘유닉스 시스템 프로그래밍’에서는 Go 언어로 시스템 프로그래밍을 하는 방법을 소개한다. 이를 위해 flag 패키지로 커맨드라인 인수를 다루는 방법과, 유닉스 시그널을 다루는 방법, 파일 입출력, bytes 패키지, io.Reader 및 io.Writer 인터페이스를 소개한다. 앞에서도 언급한 바와 같이, Go 언어로 시스템 프로그래밍하는 방법에 대해 좀 더 깊이 알고 싶은 독자는 이 책을 읽은 뒤 『Go Systems Programming』도 읽어보길 강력 추천한다.
9장, ‘Go 언어의 동시성 – Go 루틴, 채널, 파이프라인’에서는 Go 언어에서 동시성을 제공하기 위한 기능인 Go 루틴, 채널, 파이프라인에 대해 소개한다. 또한 프로세스, 스레드, Go 루틴의 차이점에 대해 설명하고, sync 패키지 사용법과 Go 스케줄러 작동 방식에 대해서도 소개한다.
10장, ‘Go 언어의 동시성 - 고급 주제’에서는 이전 장에 이어 Go 루틴과 채널을 사용하는 방법에 대해 집중적으로 소개한다. Go 스케줄러에 대해서도 좀 더 깊이 있게 살펴보고 강력한 키워드인 select 사용법과 다양한 타입의 채널, 공유 메모리, 뮤텍스, sync.Mutex 타입, sync.RWMutex 타입 등도 소개한다. 이 장의 마지막에서는 context 패키지, 워커 풀, 경쟁 조건 감지 방법 등도 다룬다.
11장, ‘코드 테스팅, 최적화, 프로파일링’에서는 코드 테스팅, 코드 최적화, 코드 프로파일링, 크로스 컴파일, 문서화, 벤치마킹, 예제 함수 작성법, 도달하지 않는 코드 찾는 방법 등을 소개한다.
12장, ‘Go 언어를 이용한 네트워크 프로그래밍의 기초’에서는 net/http 패키지를 사용하는 방법과 Go 언어에서 웹 서버 및 웹 클라이언트를 작성하는 방법을 소개한다. 또한 http.Response, http.Request, http.Transport 구조체와, http.NewServeMux 타입을 사용하는 방법도 살펴본다. 그리고 Go 언어로 웹사이트를 만드는 방법도 소개한다. 나아가 네트워크 인터페이스의 설정 사항을 읽고, DNS 조회하는 방법도 소개한다.
13장, ‘네트워크 프로그래밍 - 서버와 클라이언트 만들기’에서는 Go 언어로 UDP 및 TCP 클라이언트와 서버를 작성하는 방법과, net 패키지에서 제공하는 기능을 활용하는 방법을 소개한다. 그리고 RPC 클라이언트 및 서버 작성법, TCP 서버에서 동시성을 지원하도록 작성하는 방법, 원본 패킷 읽는 방법도 소개한다.
목차
목차
- 1장. Go 언어와 운영 체제
- 이 책의 구성
- Go 언어의 역사
- Go 언어를 배우는 이유
- Go 언어의 장점.
- 그렇다면 Go 언어는 완벽한가?.
- godoc 유틸리티.
- Go 코드 컴파일하기
- Go 코드 실행하기
- Go 언어의 두 가지 규칙
- 사용하지 않을 Go 패키지는 임포트하지 말 것
- 중괄호 작성 스타일을 따를 것
- Go 패키지 다운로드하기
- 유닉스 stdin, stdout, stderr
- 화면에 출력하기
- 표준 출력 사용하기
- 사용자로부터 입력 받기
- :=와 =
- 표준 입력으로부터 읽기
- 커맨드라인 인수 다루기
- 에러 출력
- 로그 파일 작성하기
- 로그 수준
- 로그 기능
- 로그 서버
- 로그 파일로 정보를 보내는 Go 프로그램
- log.Fate( )
- log.Panic( )
- Go 언어에서 에러 처리하기
- error 데이터 타입
- 에러 처리하기
- 참고 자료
- 연습 문제
- 요약
- 2장. Go 언어의 내부 살펴보기
- Go 컴파일러
- 가비지 컬렉션
- 삼색 알고리즘
- Go 언어 가비지 컬렉터의 구체적인 작동 방식
- 언세이프 코드
- unsafe 패키지
- unsafe 패키지에 대한 또 다른 예제
- Go에서 C 코드 호출하기
- 같은 파일에 작성한 C 코드 호출하기
- 다른 파일에 작성한 C 코드 호출하기
- C 코드
- Go 코드
- Go 코드와 C 코드 합치기
- C 코드에서 Go 함수 호출하기
- Go 패키지
- C 코드
- defer 키워드
- panic 함수와 recover 함수
- panic 함수만 사용하기
- 두 가지 유용한 유닉스 유틸리티
- strace
- dtrace
- Go 환경 파악하기
- Go 어셈블러
- 노드 트리
- go build에 대해 좀 더 자세히 살펴보기
- Go 코딩에 참고할 만한 조언
- 참고 자료
- 연습 문제
- 요약
- 3장. Go 언어의 기본 데이터 타입
- Go 언어의 루프
- for 루프
- while 루프
- range 키워드
- Go 언어의 for 루프 예
- Go 언어의 배열
- 다차원 배열
- Go 언어에서 제공하는 배열의 단점
- Go 언어의 슬라이스
- 슬라이스에 대한 기본 연산
- 슬라이스는 자동으로 확장된다
- 바이트 슬라이스
- copy( ) 함수
- 다차원 슬라이스
- 슬라이스에 대한 다른 예제
- sort.Slice()로 슬라이스 정렬하기
- Go 언어의 맵
- nil 맵에 저장하기
- 맵은 언제 사용해야 할까?
- Go 언어의 상수
- 상수 생성자 iota
- Go 언어의 포인터
- 날짜와 시간 다루기
- 시간 다루기
- 시간 파싱하기
- 날짜 다루기
- 날짜 파싱하기
- 날짜와 시간 포맷 변경하기
- 참고 자료
- 연습 문제
- 요약
- Go 언어의 루프
- 4장. 합성 타입 사용법
- 합성 타입
- 구조체
- 구조체에 대한 포인터
- new 키워드 사용법
- 튜플
- 정규 표현식과 패턴 매칭
- 정규 표현식에 관련된 몇 가지 이론
- 간단한 예제
- 심화 예제
- IPv4 주소 매칭하기
- 스트링
- 룬이란?
- unicode 패키지
- strings 패키지
- switch문
- 파이값 상당히 정확히 계산하기
- Go 언어로 키/값 스토어 만들기
- 참고 자료
- 연습 문제
- 요약
- 5장. 자료 구조로 Go 코드 개선하기
- 그래프와 노드
- 알고리즘 복잡도
- Go 언어에서 이진 트리 만들기
- Go 언어로 이진 트리 구현하기
- 이진 트리의 장점
- Go 언어에서 해시 테이블 만들기
- Go 언어로 해시 테이블 구현하기
- 검색(lookup) 기능 구현하기
- 해시 테이블의 장점
- Go 언어에서 연결 리스트 만들기
- Go 언어에서 연결 리스트 구현하기
- 연결 리스트의 장점
- Go 언어에서 이중 연결 리스트 만들기
- Go 언어에서 이중 연결 리스트 구현하기
- 이중 연결 리스트의 장점
- Go 언어에서 큐 만들기
- Go 언어에서 큐 구현하기
- Go 언어에서 스택 만들기
- Go 언어로 스택 구현하기
- container 패키지
- container/heap 사용법
- container/list 사용법
- container/ring 사용법
- 난수 생성하기
- 랜덤 스트링 생성하기
- 참고 자료
- 연습 문제
- 요약
- 6장. Go 패키지에 대해 잘 알려지지 않은 사실
- Go 패키지
- Go 언어의 함수
- 익명 함수
- 여러 값을 리턴하는 함수
- 함수의 리턴값에도 이름도 붙일 수 있다!
- 포인터를 매개변수로 받는 함수
- 포인터를 리턴하는 함수
- 함수를 리턴하는 함수
- 함수를 매개변수로 받는 함수
- Go 패키지 직접 만들기
- Go 패키지 컴파일하기
- 사설 변수와 함수
- init() 함수
- 표준 Go 패키지에 대한 코드 읽기
- net/url 패키지의 소스 코드 살펴보기
- log/syslog 패키지의 소스 코드 살펴보기
- Go 패키지 잘 만드는 방법
- syscall 패키지
- fmt.Println()의 구체적인 실행 과정
- 텍스트와 HTML 템플릿
- 텍스트 출력 생성하기
- HTML 출력하기
- 기본적인 SQLite3 커맨드
- 참고 자료
- 연습 문제
- 요약
- 7장. 리플렉션과 인터페이스
- 타입 메소드
- Go 언어의 인터페이스
- 타입 어써션
- 인터페이스 직접 정의하기
- Go 인터페이스 사용하기
- 인터페이스와 데이터 타입에 대한 switch문 작성법
- 리플렉션
- 리플렉션에 대한 간단한 예제
- 리플렉션에 대한 좀 더 심화된 예제
- 리플렉션의 세 가지 단점
- Go 언어에서 OOP하기
- 참고 자료
- 연습 문제
- 요약
- 8장. 유닉스 시스템에게 작업 지시하기
- 유닉스 프로세스
- flag 패키지
- io.Reader와 io.Writer 인터페이스
- 버퍼를 이용하는 파일 입출력과 버퍼를 이용하지 않는 파일 입출력
- bufio 패키지
- 텍스트 파일 읽기
- 텍스트 파일을 한 줄씩 읽기
- 텍스트 파일을 한 단어씩 읽기
- 텍스트 파일을 한 문자씩 읽기
- /dev/random 읽기
- 파일에서 읽고 싶은 만큼 읽기
- 바이너리 포맷을 사용하는 이유
- CSV 파일 읽기
- 파일 쓰기
- 디스크에 데이터를 읽거나 쓰기
- strings 패키지 다시 보기
- bytes 패키지
- 파일 접근 권한
- 유닉스 시그널 다루기
- 두 가지 시그널 처리하기
- 모든 종류의 시그널 처리하기
- Go 언어로 유닉스 파이프 다루기
- Go 언어로 cat(1) 유틸리티 구현하기
- 디렉토리 트리 탐색하기
- Go 언어에서 eBPF 사용하기
- syscall.PtraceRegs
- 시스템 콜 추적하기
- 유저 ID와 그룹 ID
- 참고 자료
- 연습 문제
- 요약
- 9장. Go 언어의 동시성 - 고루틴, 채널, 파이프라인
- 프로세스, 쓰레드, 고루틴
- Go 스케줄러
- 동시성과 병렬성
- Go 루틴
- Go 루틴 생성 방법
- Go 루틴 여러 개 생성하기
- Go 루틴이 마칠 때까지 기다리기
- Add()와 Done()의 호출 횟수가 일치하지 않으면 어떻게 될까?
- 채널
- 채널에 데이터 쓰기
- 채널에서 데이터 읽기
- 함수 매개변수로 지정한 채널
- 파이프라인
- 참고 자료
- 연습 문제
- 요약
- 프로세스, 쓰레드, 고루틴
- 10장. Go 언어의 동시성 - 고급 주제
- Go 스케줄러 다시 보기
- GOMAXPROCS 환경 변수
- select 키워드
- Go 루틴 만료시키기
- Go 루틴을 만료시키기 위한 첫 번째 기법
- Go 루틴을 만료시키기 위한 두 번째 방법
- Go 채널 다시 보기
- 시그널 채널
- 버퍼 채널
- 닐 채널
- 채널에 대한 채널
- Go 루틴의 실행 순서 지정하기
- 공유 메모리와 공유 변수
- sync.Mutex
- sync.RWMutex 타입
- Go 루틴으로 메모리 공유하기
- 경쟁 조건 발견하기
- context 패키지
- context 패키지를 이용한 좀 더 복잡한 예제
- 워커 풀
- 참고 자료
- 연습 문제
- 요약
- Go 스케줄러 다시 보기
- 11장. 코드 테스팅, 최적화, 프로파일링
- 11장에서 사용하는 Go 버전
- Go 버전 1.9와 1.10 비교
- 베타 또는 RC 버전의 Go 설치하기
- 최적화
- Go 코드 최적화하기
- Go 코드 프로파일링
- 표준 Go 패키지 net/http/pprof
- 간단한 프로파일링 예제
- 좀 더 편리한 외부 패키지로 프로파일하기
- Go 프로파일러의 웹 인터페이스
- go tool trace 유틸리티
- Go 코드 테스트하기
- 기존 코드에 대한 테스트 코드 작성하기
- Go 코드 벤치마킹하기
- 간단한 벤치마킹 예제
- 잘못 작성한 벤치마크 함수의 예
- 쓰기 버퍼 벤치마킹하기
- 실행되지 않는 코드 찾기
- 크로스 컴파일
- 예제 함수 만들기
- 문서 생성하기
- 참고 자료
- 연습 문제
- 요약
- 11장에서 사용하는 Go 버전
- 12장. Go 언어를 이용한 네트워크 프로그래밍의 기초
- net/http, net, http.RoundTripper
- http.Response 타입
- http.Request 타입
- http.Transport 타입
- TCP/IP에 대해
- IPv4와 IPv6에 대해
- nc(1) 커맨드라인 유틸리티
- 네트워크 인터페이스로부터 설정 읽기
- DNS 룩업
- 도메인의 NS 레코드 조회하기
- 도메인에 대한 MX 레코드 조회하기
- Go 언어로 웹 서버 만들기
- HTTP 서버 프로파일링하기
- Go 언어로 웹사이트 만들기
- HTTP 트레이싱
- HTTP 핸들러 테스트하기
- Go 언어로 웹 클라이언트 생성하기
- 좀 더 기능이 풍부한 웹 클라이언트 만들기
- HTTP 연결 타임아웃하기
- SetDeadline 세부사항
- 타임아웃 주기를 서버쪽에 설정하기
- 또 다른 타임아웃 기법
- 와이어샤크와 티샤크
- 참고 자료
- 연습 문제
- 요약
- net/http, net, http.RoundTripper
- 13장. 네트워크 프로그래밍 - 서버와 클라이언트 만들기
- 표준 Go 패키지 net
- TCP 클라이언트
- TCP 클라이언트를 약간 변형한 버전
- TCP 서버
- TCP 서버를 약간 변형한 버전
- UDP 클라이언트
- UDP 서버 구현하기
- 동시성을 지원하는 TCP 서버
- 동시성을 지원하는 TCP 서버의 또 다른 버전
- 원격 프로시저 호출
- RPC 클라이언트
- RPC 서버
- 로우레벨 네트워크 프로그래밍
- 원본 상태의 ICMP 패킷 수집하기
- 그 이상이 알고 싶다면?
- 참고 자료
- 연습 문제
- 요약
- 찾아보기
도서 오류 신고
정오표
정오표
[p.369 : 회색 박스 첫 줄]
정의과
->
정의와