Top

Go 언어 실전 테크닉 [Go 언어의 특징만 콕 집어 해설한]

  • 원서명みんなのGo言語 (ISBN 9784774183923)
  • 지은이마츠키 마사유키(松木 雅幸), mattn, 후지와라 슌이치로(藤原 俊一郎), 나카시마 다이치(中島 大一), 마키 다이스케(牧 大輔), 스즈키 켄타(鈴木 健太)
  • 옮긴이박현태
  • ISBN : 9791161750262
  • 22,000원
  • 2017년 08월 16일 펴냄 (절판)
  • 페이퍼백 | 280쪽 | 188*235mm
  • 시리즈 : 프로그래밍 언어

판매처

  • 현재 이 도서는 구매할 수 없습니다.

책 소개

요약

구글에 의해 개발된 가볍고 성능이 뛰어난 Go 언어, 이 책에서는 실전에서 Go 언어를 사용 중인 개발자들이 축적한 노하우를 바탕으로 Go 언어를 설명한다. 꼭 짚고 넘어가야 할 Go 언어의 특징에 대해서는 예제로 독자들의 이해를 최대한 높이기 위해 노력하고, 굳이 설명하지 않아도 되는 문법적인 요소는 과감히 생략했다. 이 책으로 Go 언어의 특징과 장점에 대해 이해시키고 프로그램을 개발하는 데 있어 Go 언어를 적재적소에 활용할 수 있도록 돕는다.

이 책에서 다루는 내용

■ 팀 개발의 시작 방법
■ 멀티 플랫폼에의 대응
■ 애플리케이션 작성 테크닉
■ 커맨드 라인 툴 작성
■ reflect/테스트 툴

저자/역자 소개

지은이의 말

이 책은 구글에서 개발한 프로그래밍 언어 Go의 장단점에 정통한 최전선 현역 개발자들이 Go에 관한 다양한 팁과 편리한 사용방법을 소개하는 책이다. 이 책을 손에 든 여러분은 이미 특정 프로그래밍 언어를 잘 다루고 있다고 생각하지만 굳이 Go를 배울 필요가 있을까? 엄밀하게는 상황에 따라 대답이 달라질 수도 있지만 여러분이 사용 가능한 언어가 C 또는 이른바 로우 레벨(low Level)이라는 경량 언어(Ruby/Perl/Python 등)라면 대답은 상당히 높은 확률로 “YES”일 것이다.
C를 이용한다면 컴파일러의 지원을 받아 타입 검사를 하면서 메모리 관리를 포함한 모든 동작을 관리하고, 효율적으로 최대한의 성능을 발휘하는 프로그래밍을 할 수 있다. 하지만 C는 로우 레벨 언어이므로 프로그래밍이 생각보다 쉽지가 않다.
경량 언어는 프로그래밍이 간단하지만 성능을 생각만큼 낼 수 없을뿐더러 정적 타입 검사의 혜택도 받을 수 없다고 생각한 적은 없었는지? 그런 사람에겐 GO가 적절한 언어이다! GO는 경량 언어와 C 등의 로우 레벨 언어 사이에서 지금까지 해결 방법이 없었던 틈새를 채워주는 언어인 셈이다. 그럼 Go의 장점에 대해서 살펴보자.

지은이 소개

마츠키 마사유키(松木 雅幸)

mattn

후지와라 슌이치로(藤原 俊一郎)

나카시마 다이치(中島 大一)

마키 다이스케(牧 大輔)

스즈키 켄타(鈴木 健太)

업무에서 Go를 활용 중인 집필자들로, 실제로 Go를 사용하는 동안 축적한 노하우를 이 한 권에 다 담았다. 트위터 @songmu의 계정에서 만날 수 있다.

옮긴이의 말

왜 Go 언어는 좋은 언어인가? 좋은 언어라면 과연 어떠한 점이 기존의 언어와 다르며 그 특징은 무엇인가? 이 질문에 대해 한 권의 책으로 최대한 독자들의 이해를 돕기 위해 저자들이 각자의 경험을 바탕으로 이야기를 풀어냈다.
물론 기존의 언어와 비교했을 때 모든 부분에서 압도적으로 뛰어나다고는 할 수 없다. 하지만 현실적 노선에서 각 언어의 좋은 특징들이 매우 조화롭게 균형이 잘 잡힌 언어가 Go라고 감히 평가하고 싶다.
그럼 왜 그렇게 평가했으며 이 책이 Go라는 언어를 알아가는 데 왜 유용한 책인가? 옮긴이는 독자들의 이해를 돕기 위해 크게 3가지 관점으로 이 책을 집필했다고 평가한다. 첫째, 실전에서 Go 언어를 사용 중인 개발자들이 축적해온 노하우를 바탕으로 풀어냈다. 둘째, 꼭 짚고 넘어가야 할 Go 언어의 특징에 대해서는 예제를 들어가며 독자들의 이해를 최대한 높이기 위한 장치를 마련해 두었다. 셋째, 굳이 설명하지 않아도 되는 문법적인 요소에 대해서는 과감히 생략하여 쉽게 읽을 수 있게 했다.
사족일지도 모르지만 클라우드 서비스를 개발 운영 중인 옮긴이도 번역하면서 Go 언어의 특징에 대해 새삼 다시 배웠고 좋은 경험이었다고 생각한다. 독자분들도 이 책을 통해 조금이라도 Go 언어의 가치에 대해 깨닫는 부분이 있었으면 하는 바람이다.

옮긴이 소개

박현태

2007년 현해탄을 건너 일본에 정착 후 10년간 일본의 IT업계에서 종사하며 금융권 인프라와 개발 업무를 거쳐 지금은 일본계 IT벤처 그룹에서 7년간 근무 중이다.
지금의 회사에서는 클라우드 서비스 개발팀의 매니저로 주로 자사의 퍼블릭/프라이빗 클라우드 서비스의 설계/개발/운영보수와 데이터 센터 업무까지 두루두루 섭렵 중에 있다. 2011년부턴 클라우드 인프라 스트럭처 오픈소스인 OpenStack에 관심이 있어, 자사의 퍼블릭 클라우드 서비스인 ConoHa, Z.com Enterprise Cloud 등의 서비스를 OpenStack으로 개발했으며, 2015년 OpenStack summit Tokyo에서는 ConoHa 클라우드의 멀티 리전(multi-region)에 대해서도 발표했다.
최근에는 클라우드 서비스의 개발과 더불어 해마다 늘어나는 자사 클라우드 서비스의 자동 구축에 관한 디플로이(deploy) 프로젝트를 진행 중에 있다.

목차

목차
  • 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
      • 빌드와 디플로이
      • 모니터링
      • 정리

  • 2장. 멀티 플랫폼에서 실행하는 사내 툴 만드는 방법
  • 2.1 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 패키지를 이용하는 방법
      • 마무리

  • 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 테스트 테크닉
      • 스테이터스 코드 테스트
      • 출력 메시지 테스트
      • 마무리

  • 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
      • 마무리

  • 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에서의 테스트 마무리

도서 오류 신고

도서 오류 신고

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

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

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

정오표

정오표

[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))
}