Go 언어 실전 테크닉 [Go 언어의 특징만 콕 집어 해설한]
- 원서명みんなのGo言語 (ISBN 9784774183923)
- 지은이마츠키 마사유키(松木 雅幸), mattn, 후지와라 슌이치로(藤原 俊一郎), 나카시마 다이치(中島 大一), 마키 다이스케(牧 大輔), 스즈키 켄타(鈴木 健太)
- 옮긴이박현태
- ISBN : 9791161750262
- 22,000원
- 2017년 08월 16일 펴냄 (절판)
- 페이퍼백 | 280쪽 | 188*235mm
- 시리즈 : 프로그래밍 언어
판매처
- 현재 이 도서는 구매할 수 없습니다.
책 소개
요약
구글에 의해 개발된 가볍고 성능이 뛰어난 Go 언어, 이 책에서는 실전에서 Go 언어를 사용 중인 개발자들이 축적한 노하우를 바탕으로 Go 언어를 설명한다. 꼭 짚고 넘어가야 할 Go 언어의 특징에 대해서는 예제로 독자들의 이해를 최대한 높이기 위해 노력하고, 굳이 설명하지 않아도 되는 문법적인 요소는 과감히 생략했다. 이 책으로 Go 언어의 특징과 장점에 대해 이해시키고 프로그램을 개발하는 데 있어 Go 언어를 적재적소에 활용할 수 있도록 돕는다.
이 책에서 다루는 내용
■ 팀 개발의 시작 방법
■ 멀티 플랫폼에의 대응
■ 애플리케이션 작성 테크닉
■ 커맨드 라인 툴 작성
■ reflect/테스트 툴
목차
목차
- 1장. Go를 이용한 팀 개발의 시작 방법과 코드를 작성하는 데 있어서의 마음가짐
- 1.1 개발 환경 구축 - 설치부터 $GOPATH 설정까지
- 개발 환경 구축
- Go 설치
- $GOPATH 설정
- go get 시험해 보기
- Go의 REPL인 gore를 사용
- $GOPATH 관리를 위한 ghq 도입
- peco로 간단하게 리포지터리 간 이동하기
- Go로 만들어진 툴 설치
- 1.2 에디터와 개발환경
- 코드 포맷터, lint 툴에서 문서열람까지
- Go와 에디터
- Go에디터에 대한 사고방식
- 개발 지원 툴
- 코드 포맷터: gofmt
- goimports
- lint 툴: go vet과 golint
- 문서 열람 툴: godoc
- 그 밖의 툴: gorename,
- guru, gocode, godef, gotags
- 1.3 Go 시작하기 - start a tour of Go
- 학습: Tour of Go
- 문서 읽기
- 프로젝트 시작하기
- 디렉토리명과 패키지명
- 디렉토리 구성
- 파일 분할
- 패키지 분할
- 서브 패키지의 임포트 방법
- 의존 관리: vendoring과 glide
- glide novendor
- 태스크 러너로써 Makefile을 사용
- 1.4 Go답게 코드 작성하기 - Go를 사용하고 싶다면 Go를 따르라
- 더욱 Go스러운 코드를 작성
- panic사용 않고, error를 잘 반환, 에러 체크 확실히 하기
- 정규 표현을 피하고 strings 패키지를 사용
- strings패키지
- 어쩔 수 없이 정규 표현을 사용하는 경우
- map 피하기
- reflect 피하기
- 거대한 struct 사용, 상속하지 않기
- 병렬처리의 과다 사용 피하기
- Go 코드 읽기
- 테스트와 CI
- 빌드와 디플로이
- 모니터링
- 정리
- 1.1 개발 환경 구축 - 설치부터 $GOPATH 설정까지
- 2장. 멀티 플랫폼에서 실행하는 사내 툴 만드는 방법
- 2.1 Go로 사내 툴을 만드는 이유 - 저마다 제각각인 건 당연한 일
- 다양한 환경에 대한 대응이 불가피
- Go를 채용하는 장점
- Go를 채용하는 장점
- 2.2 지켜야 할 암묵적인 규칙 - OS 간의 이식을 미리 가정
- 적극적으로 path/filepath 사용하기
- 적극적으로 defer 사용하기
- 적극적으로 UTF-8을 다루기
- 2.3 TUI를 Windows에서 실행하기 - termbox와 go-colorable
- 간단히 TUI 애플리케이션을 만드는 termbox
- go-colorable의 사용법
- 2.4 OS 고유 처리에 대응 - runtime.GOOS와 Builds Constraints
- runtime.GOOS를 사용
- Build Constraints를 사용
- 파일명에 의한 지정
- +build 주석에 의한 지정
- pkg-config: 복잡한 컴파일 옵션에 대처
- 2.5 노력하기보단 주변 툴에 의존하기 - 하나의 애플리케이션에서는 하나의 처리만
- Go 애플리케이션의 데몬화(化)
- 리눅스의 경우
- 유닉스의 경우
- Windows의 경우
- 2.6 싱글 바이너리 - go-bindata와 go-assets의 활용
- Go는 싱글 바이너리
- go-bindata를 사용
- go-assets 사용
- 2.7 Windows 애플리케이션 만들기 - 다양한 사용자를 가정하기
- Windows 애플리케이션을 만드는 방법
- 리소스 파일 링크하기
- GUI를 만든다면
- 2.8 설정 파일 취급 - 멀티 플랫폼에서의 주의점
- 설정 파일 취급 시의 주의점
- 어떤 포맷으로 할까?
- INI 파일
- JSON
- YAML
- TOML
- 설정 파일을 어디에 둘까?
- JSON을 잘 정리해서 출력하기
- 2.9 사내 툴, 그 이후 - 멀티 플랫폼 대응 애플리케이션의 장점
- 한 번 만들었다고 끝이 아니다
- 한 번 만들었다고 끝이 아니다
- 다양한 환경에 대한 대응이 불가피
- 3장. 실용적인 애플리케이션 만들기
- 3.1 머리말 - 실용적인 애플리케이션의 조건이란
- 실용적인 애플리케이션이란
- 어떠한 기능을 갖고 있는지를
- 쉽게 알 수 있을 것
- 성능이 좋을 것
- 다양한 입출력을 다룰 수 있을 것
- 인간이 다루기 쉬운 타입일 것
- 예외의 경우에 안전하게 동작을
- 정지시킬 수 있을 것
- 3장에서 소개하는 테크닉
- 3.2 버전 관리 - 사용자가 확인하기 쉽게 하기
- 버전 번호를 바이너리에 넣기
- flag 패키지의 이용
- 셸 스크립트
- go-latest로 최신 버전 체크
- GitHub 태그
- HTML 메타 태그
- JSON API
- 3.3 효율적인I/O 처리 - 버퍼링, 콘텐츠 취득, 파일 저장
- bufio로 입력을 버퍼링해서 다루기
- bufio로 출력을 버퍼링하기
- LL로 출력의 자동 버퍼링하기
- Go에서는 자동 버퍼링은 하지 않는다
- 버퍼 크기 지정
- go-isatty로
- 출력처가 단말기인지를 판별하기
- 여러 소스로부터 같은 콘텐츠 취득
- 콘텐츠 취득의 흐름
- 파일에서 얻기
- HTTP(S) URL에서 얻기
- Amazon S3에서 얻기
- 여러 출력처에 한번에 쓰기
- 로그 출력과 동시에
- 메모리에 보유해 이용하기
- 3.4 난수 다루기 - math/rand, crypto/rand
- 난수 다루기 사례
- 난수를 취급하는 표준 패키지
- math/rand
- crypo/rand
- 3.5 인간이 다루기 쉬운 타입의 수치 - go-humanize
- go-humanize
- 표기 변환과 파서?parser?
- 표기변환
- 파서
- 3.6 Go에서 외부 명령 실행하기 - os/exec 패키지 활용
- 외부 커맨드를 실행하는 이점
- os/exec 패키지
- os/exec 패키지의 사례
- 외부 커맨드를
- 셸 경유로 기동하기(유닉스계열 환경)
- 3.7 타임아웃하기 - 패키지 기능의 이용과 직접 구현하기
- 사용하는 패키지에
- 타임아웃 기능이 준비된 경우
- 직접 타임아웃 구현
- 3.8 시그널 다루기 - 적절한 핸들링하기
- Go로 시그널 다루기
- 독자적인 시그널 정의하기
- 3.9 goroutine의 정지 - 병렬 처리, 비동기 실행의 핸들링
- goroutine을 외부에서 정지시키기
- 채널을 사용하는 방법
- Context 패키지를 이용하는 방법
- 마무리
- 3.1 머리말 - 실용적인 애플리케이션의 조건이란
- 4장. 커맨드 라인 툴 만들기
- 4.1 왜 Go로 CLI 툴을 만드는가? - 3가지 장점
- Go로 CLI 툴을 만드는 이유
- 배포의 용이성
- 다양한 플랫폼에 쉽게 대응
- 성능
- 라쿠텐의 사례
- 4.2 디자인 - 인터페이스와 리포지터리 구성
- CLI 툴 인터페이스
- 싱글 커맨드 패턴
- 서브 커맨드 패턴
- 리포지터리 구성
- 바이너리를 메인 성과물로 할 경우
- 라이브러리를 메인 성과물로 할 경우
- 4.3 flag 패키지 - 커맨드 라인 옵션 활용하기
- flag 패키지란
- 기본적인 사용 방법
- 몇 가지 테크닉
- 롱 옵션과 쇼트 옵션
- 환경 변수
- 어디에 기술할 것인가?
- 내부 구현과 커스터마이즈
- flag.IntVar 구현
- 커스터마이즈하기
- 범용적인 사용 방법
- 한 번 더 flag.IntVar 구현 살펴보기
- 독자적인 타입 정의하기
- 서드 파티 패키지의 활용
- spfl3/pflag 패키지
- jessevdk/go-flags 패키지
- alecthomas/kingpin 패키지
- 4.4 서브 커맨드를 가진 CLI 툴 - 서드 파티 패키지의 활용
- 서드 파티 패키지 소개
- urfave/cli
- spf13/cobra
- docopt/docopt.go
- mitchellh/cli
- google/subcommands
- mitchellh/cli의 사용방법
- 서브 커맨드의 정의
- 서브 커맨드 사용하기
- 서브 커맨드에 플래그 붙이기
- 4.5 사용하기 쉽고, 운용보수하기에 쉬운 툴 - 서드 파티 패키지의 활용
- 사용하기 쉬운 툴
- 종료 스테이터스 코드
- 주의점
- 표준 출력과 표준 오류 출력
- 오류 메시지
- 운용보수하기에 쉬운 툴
- Go의 CLI 테스트 테크닉
- 스테이터스 코드 테스트
- 출력 메시지 테스트
- 마무리
- 4.1 왜 Go로 CLI 툴을 만드는가? - 3가지 장점
- 5장. The Dark Arts Of Reflection
- 5.1 동적인 타입 판별 - 실행 때까지 타입 판별을 기다리기
- 타입 검출과 어써션 타입의 한계
- 타입 검출과 어써션 타입의 한계
- 5.2 reflect 패키지 - 타입 정보 얻기와 조작
- reflect 패키지를 사용해 얻을 수 있는 정보
- reflect.Value
- 타입보다 동작 바꾸기
- map인 경우의 처리
- struct인 경우의 처리
- reflect.Type
- struct 파스하기
- 5.3 reflect 사용 예 - 함정에 빠지지 않기 위한 대처방법
- 값을 동적으로 생성하기
- 보이는 범위, 보이지 않는 범위
- 포인터와 interface값
- Set 가능한 값
- reflect로 interface의 충족 여부 확인
- 동적인 select 문 구축
- 5.4 reflect 성능 정리 - 적재적소에 사용하기
- reflect와 어써션 타입의 비교
- reflect에 의한 sort
- 마무리
- 5.1 동적인 타입 판별 - 실행 때까지 타입 판별을 기다리기
- 6장. Go의 테스트 관련 툴 세트
- 6.1 Go의 테스트 방식 - ‘명시’와 ‘심플’
- 소프트웨어 테스트
- Go의 테스트
- 6.2 testing 패키지 입문 - 테스트 실행과 테스트 코드의 작성
- 테스트 실행 방법
- Testable Examples
- Unordered output
- Exmaples를 godoc에 싣기
- 6.3 벤치 마크 입문 - 문자열 결합의 예로 배우기
- 벤치 마크 실행 방법
- 서브 벤치 마크 이용
- 6.4 테스트의 실전 테크닉 - 배열 플로우, 목업, 커버리지
- Table Driven Tests
- reflect.DeepEqual 사용하기
- Race Detector를 이용해
- 충돌 상태 검출하기
- TestMain으로 테스트 제어
- Build Constraints를 이용한 테스트 전환
- 테스트의 변수 또는 함수의 대체
- 인터넷을 이용한 목업
- net/http/httptest 패키지
- 테스트 커버리지
- Go에서의 테스트 마무리
- 6.1 Go의 테스트 방식 - ‘명시’와 ‘심플’
도서 오류 신고
정오표
정오표
[p.43 : 아래서 5행]
처리 시간를
->
처리 시간을
[p.43 : 소스 코드 1행]
result, error := doSomething()
->
result, err := doSomething()
[p.61 : 소스 코드 9행]
http.Redirect(w, r, "/" 301)
->
http.Redirect(w,r, "/", 301)
[p.86 : 아래서 6행]
io.Copy(w, bytes.NewBuffer(bs))
->
io.Copy(w, bytes.NewBuffer(bs))
}