Top

Go 마스터하기 3/e [실습 예제와 함께 배우는 네트워크, 동시성, 테스트, gRPC 및 제네릭]

  • 원서명Mastering Go, 3rd Edition : Harness the power of Go to build professional utilities and concurrent servers and services (ISBN 9781801079310)
  • 지은이미할리스 추칼로스(Mihalis Tsoukalos)
  • 옮긴이허성연
  • ISBN : 9791161756882
  • 45,000원 (eBook 36,000원)
  • 2022년 10월 31일 펴냄
  • 페이퍼백 | 876쪽 | 188*235mm
  • 시리즈 : 프로그래밍 언어

eBook 판매처

리디북스 알라딘 YES24

책 소개

본문에 쓰인 컬러 이미지는 여기에서 내려 받으세요.
소스 코드 파일은 여기에서 내려 받으실 수 있습니다.

https://github.com/AcornPublishing/mastering-go-3e

요약

Go 언어에 관련한 지식을 좀 더 넓히고 싶은 중급 Go 프로그래머나 다른 프로그래밍 언어 경험이 있는 독자들을 대상으로 하는 책이다. Go 언어의 기본 개념부터 네트워크, 동시성, 테스트, gRPC, 제네릭 등의 주제들을 많은 실습 예제와 함께 소개한다. 3판에서는 2판에 비해 책의 두께를 줄였으며 더 자연스러운 흐름으로 재구성했다. 더 나은 Go 언어 개발자가 되고 싶다면 이 책이 도움을 줄 수 있을 것이다.

이 책에서 다루는 내용

◆ 실전에서의 Go 활용 방법
◆ 안정적이고 동시성을 지원하는 고성능 코드
◆ 슬라이스, 배열, 맵, 포인터 등의 데이터 구조 다루기
◆ 리플렉션과 인터페이스를 활용한 재사용 가능한 패키지 개발
◆ 효과적인 Go 프로그래밍을 위한 제네릭 활용
◆ 동시성 있는 RESTful 서버 및 gRPC 클라이언트와 서버 개발
◆ JSON 데이터를 이용하는 Go 구조체 정의

이 책의 대상 독자

Go에 관련한 지식을 좀 더 넓히고 싶은 중급 Go 프로그래머를 대상으로 한다. 다른 프로그래밍 언어에 대한 경험이 있는 상태에서 Go를 배우고 싶은 개발자도 기초를 볼 필요 없이 곧바로 Go를 익힐 수 있을 것이다.

이 책의 구성

1장, ‘Go의 간략한 소개’에서는 Go의 역사와 Go의 중요한 특징 및 장점부터 소개한다. Go doc과 go doc 유틸리티를 소개하고, Go 프로그램을 컴파일하고 실행하는 방법을 설명한다. 그런 다음엔 결과를 출력하는 방법과 사용자 입력을 받는 방법, 커맨드라인 인수를 다루는 방법, 로그 파일의 사용법을 다룬다. 마지막으로 전화번호부 애플리케이션의 기본 버전을 개발해보고 이후 장에서 이를 발전시켜 나간다.
2장, ‘기본 타입’에서는 Go의 기본 타입들을 알아보고 같은 데이터 타입들을 모아 사용할 수 있는 배열과 슬라이스도 알아본다. Go의 포인터, 상수, 날짜 및 시간을 다루는 방법도 알아보고 마지막에서는 난수를 생성해 전화번호부 애플리케이션의 데이터를 무작위 데이터로 채워본다.
3장, ‘합성 데이터 타입’에서는 맵, 구조체, struct 키워드를 살펴본다. 또한 정규표현식과 패턴 매칭, CSV 파일도 다룬다. 마지막으로 전화번호부 애플리케이션의 데이터가 영속적으로 저장되게 만든다.
4장, ‘리플렉션과 인터페이스’에서는 리플렉션, 인터페이스, 데이터 타입에 대한 함수인 타입 메서드를 다룬다. 또한 sort.Interface 인터페이스를 사용해 슬라이스를 정렬하는 방법, 빈 슬라이스, 타입 단언, 타입 스위치, error 데이터 타입 등을 다룬다. 그리고 Go에서 객체지향 개념을 흉내 내는 방법을 살펴보고 전화번호부 애플리케이션도 개선한다.
5장, ‘패키지와 함수’에서는 패키지의 주요한 원소인 패키지, 모듈, 함수를 다룬다. PostgreSQL 데이터베이스와 상호작용하는 패키지를 개발하고 문서화한다. 또한 defer 키워드를 설명하고 깃랩 러너와 깃허브 액션을 통한 자동화 및 Go 바이너리의 도커 이미지 생성도 알아본다.
6장, ‘유닉스 시스템’에게 작업 지시에서는 시스템 프로그래밍을 살펴본다. 다루는 주제는 커맨드라인 인수 받기, 유닉스 시그널 처리, 파일 입출력, io.Reader와 io.Writer 인터페이스, viper와 cobra 패키지 등이 포함돼 있다. 또한 JSON, XML, YAML 파일을 다루는 방법, 유닉스 파일 시스템에서 순환 참조를 찾는 방법, Go 바이너리에 파일 임베딩, os.ReadDir() 함수, os.DirEntry 타입, io/fs 패키지 등을 살펴본다. 마지막으로 cobra 패키지로 전화번호부 애플리케이션을 적절한 커맨드라인 유틸리티로 변환하고 JSON 데이터를 사용하게 개선한다.
7장, ‘Go의 동시성’에서는 고루틴, 채널, 파이프라인을 다룬다. 프로세스, 스레드, 고루틴의 차이점을 살펴보고, sync 패키지 및 Go 스케줄러의 동작 방식도 알아본다. 또한 select 키워드와 여러 종류의 Go 채널, 공유 메모리, 뮤텍스, sync.Mutex 타입, sync.RWMutex 타입도 알아본다. 그리고 context 패키지와 semaphore 패키지, 워커 풀, 고루틴 타임아웃, 경쟁 상태 감지 등도 소개한다.
8장, ‘웹 서비스 만들기’에서는 net/http 패키지, 웹 서버 및 웹 서비스 개발, 프로메테우스로 메트릭 노출, 그라파나로 메트릭 시각화, 웹 클라이언트 및 파일 서버 개발 등을 실습한다. 또한 전화번호부 애플리케이션을 웹 서비스로 변환하고 이를 위한 커맨드라인 클라이언트도 생성한다.
9장, ‘TCP/IP와 웹소켓’에서는 net 패키지, TCP/IP, TCP와 UDP 프로토콜, 유닉스 소켓, 웹소켓 프로토콜을 다룬다. 또한 많은 종류의 네트워크 서버와 클라이언트를 개발한다.
10장, ‘REST API’에서는 REST API와 RESTful 서비스를 다룬다. REST API를 정의해보고 동시성을 지원하는 RESTful 서버 및 RESTful 서비스의 클라이언트로 동작하는 커맨드라인 유틸리티를 개발한다. 마지막으로 REST API의 문서화를 위한 스웨거를 소개하고 바이너리 파일을 업로드 및 다운로드하는 방법도 알아본다.
11장, ‘코드 테스팅과 프로파일링’에서는 코드 테스팅, 코드 최적화, 코드 프로파일링, 크로스컴파일, Go 코드 벤치마킹, 예제 함수 만들기, go:generate의 사용법, 도달할 수 없는 Go 코드를 찾는 법 등을 다룬다.
12장, ‘gRPC’에서는 Go에서 gRPC를 다룬다. 또한 gRPC 서비스의 메서드와 메시지를 정의하는 방법을 살펴보고 이를 Go 코드로 어떻게 변환하는지 알아본 다음 gRPC 서비스의 서버 및 클라이언트를 개발한다.
13장, ‘제네릭’에서는 제네릭과 제네릭 함수를 작성하기 위한 문법, 제네릭 데이터 타입을 정의하는 방법을 알아본다.
부록 A, ‘Go 가비지 컬렉터’에서는 Go 가비지 컬렉터의 동작과 가비지 컬렉터가 코드의 성능에 끼치는 영향을 살펴본다.

저자/역자 소개

지은이의 말

뛰어난 Go 개발자가 되는 것을 돕기 위한 책이다. Go 언어 자체가 엄청나게 바뀐 것은 아니기 때문에 2판의 내용도 여전히 유용하다. 그렇지만 3판에서는 많은 부분을 개선했다.
RESTful 서비스 개발, 웹소켓 프로토콜, Go 프로젝트에서의 깃허브 액션 및 깃랩 러너 활용 등 새롭고 흥미로운 주제와 제네릭 관련 내용을 다룬 하나의 장 그리고 더욱 실용적인 예제를 추가했다. 2판보다 적은 페이지로 구성하려고 노력했다. 책의 구조 역시 더욱 자연스러운 흐름으로 재구성해 쉽고 빠르게 읽을 수 있게 했다.
또한 이론과 실습 관련 내용을 적절히 분배하고자 노력했다. 각 장의 끝에 배치된 연습문제는 꼭 풀어 보길 바란다.

지은이 소개

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

기술 관련 글쓰기를 좋아하는 유닉스 시스템 엔지니어다. 『Go Systems Programming』(Packt, 2017)과 『Go 마스터하기』(에이콘, 2018), 『Go 마스터하기 2/e』(에이콘, 2021)의 저자이기도 하다. 파트라스대학교(University of Patras)에서 수학 학사 학위를 받았으며 유니버시티 칼리지 런던(University College London)에서 IT 관련 석사 학위도 받았다. 지금까지 「Sys Admin」, 「MacTech」, 「Linux User and Developer」, 「Usenix;login:」, 「Linux Format」, 「Linux Journal」 등의 여러 저널에 300여 편 이상의 글을 기고했다. 주요 관심 분야는 시계열, 데이터베이스, 인덱스다. https://www.mtsoukalos.eu/와 @mactsouk에서 직접 만나볼 수 있다.

옮긴이의 말

이제 Go 언어는 더 이상 새로운 언어가 아닙니다. 쿠버네티스(Kubernetes), 도커(Docker) 등 많은 중요한 소프트웨어 프로젝트가 Go 언어를 이용해 개발됐고, 특히 클라우드 네이티브 환경과 마이크로서비스 환경에서 사용했을 때 많은 장점이 존재합니다. 또한 미국의 빅테크 기업들에서도 Go 언어를 사용하고 있는 추세입니다.
국내에서도 점차 Go 언어를 도입하는 기업들이 늘어나고 있으며, 2022년 프로그래머스에서 실시한 설문조사에서 가장 배우고 싶은 언어 2위에 선정되는 등 국내에서도 Go 언어에 대한 관심이 높아지고 있습니다. 몇 년 뒤에는 국내에서도 Go 언어가 배워서 도입해보고 싶은 언어로 인식되는 것이 아니라 이미 사용되고 있는 대세 언어로 인식될 것이라 믿습니다.
이 책에서는 Go 언어에 대한 기초적인 내용부터 심화 주제까지 다양한 내용을 다루고 있습니다. 다른 프로그래밍 언어를 이미 알고 있는 독자들이라면 Go의 동시성을 다루는 7장을 주의 깊게 읽어 보기를 권장합니다. Go 언어의 동시성 개념을 잘 이해하면 Go 언어에 빨리 친숙해질 수 있을 것입니다. 또한 Go 언어를 활용해 RESTful 서비스가 아닌 gRPC 서비스를 만들어보는 12장을 특히 주의 깊게 읽어보면 Go 언어가 마이크로서비스 환경에서 어떻게 활용되고 있는지 엿볼 수 있습니다.

옮긴이 소개

허성연

서울대학교 컴퓨터공학부를 졸업했다. 현재 당근마켓에서 소프트웨어 엔지니어로 근무하고 있으며, Go 언어를 이용해 각종 서비스들을 만들고 있다. 개발 관련 주제라면 밤새 떠들 수 있고, 소프트웨어 기술로 사람들의 문제를 해결하고 싶다. 취미로 수영하는 것을 즐긴다.

목차

목차
  • 01장. Go의 간략한 소개
    • Go 소개
      • Go의 역사
      • 윈도우가 아니라 유닉스인 이유
      • Go의 장점
      • go doc과 godoc 유틸리티
    • Hello World!
      • 함수 소개
      • 패키지 소개
    • Go 코드 실행
      • Go 코드 컴파일
      • Go를 스크립트 언어처럼 사용
      • 중요한 형식과 코딩 규칙
    • Go의 중요한 특성
      • 변수 선언과 사용
        • 변수 출력
      • 프로그램 흐름 제어
      • for 루프와 range로 반복
      • 사용자 입력받기
      • 표준 입력 읽기
        • 커맨드라인 인수 사용
      • 에러 변수로 입력 타입 구분
      • Go의 동시성 모델 이해
    • Go로 which(1) 개발
    • 정보 로깅
      • log.Fatal()과 log.Panic()
      • 커스텀 로그 파일 작성
      • 로그 항목에 줄 번호 츨력
    • 제네릭 개요
    • 기초적인 전화번호부 애플리케이션 개발
    • 연습문제
    • 요약
    • 참고 자료

  • 02장. 기본 타입
    • error 타입
    • 숫자 데이터 타입
    • 숫자가 아닌 데이터 타입
      • 문자열, 문자, 룬
        • 정수를 문자열로 변환
        • unicode 패키지
        • strings 패키지
      • 날짜와 시간
        • 날짜와 시간을 파싱하는 유틸리티
        • 타임 존 다루기
    • Go 상수
      • 상수 생성기 iota
    • 비슷한 데이터 모으기
      • 배열
      • 슬라이스
        • 슬라이스 길이와 용량
        • 슬라이스의 일부분 선택
        • 바이트 슬라이스
        • 슬라이스에서 원소 삭제
        • 배열과 슬라이스의 관계
        • copy() 함수
        • 슬라이스 정렬
    • 포인터
    • 난수 생성
      • 랜덤한 문자열 생성
      • 안전한 난수 생성
    • 전화번호부 애플리케이션 업데이트
    • 연습문제
    • 요약
    • 참고 자료

  • 03장. 합성 데이터 타입
      • nil 맵에 저장
      • 맵 반복
    • 구조체
      • 새 구조체 정의
      • new 키워드 사용
      • 구조체의 슬라이스
    • 정규표현식과 패턴 매칭
      • Go 정규표현식
      • 이름과 성 매칭
      • 정수 매칭
      • 레코드의 필드 매칭
    • 전화번호부 애플리케이션 개선
      • CSV 파일 다루기
      • 인덱스 추가
      • 전화번호부 애플리케이션의 개선된 버전
    • 연습문제
    • 요약
    • 참고 자료

  • 04장. 리플렉션과 인터페이스
    • 리플렉션
      • Go 구조체의 내부
      • 리플렉션을 이용해 구조체 값 바꾸기
      • 리플렉션의 세 가지 단점
    • 타입 메서드
      • 타입 메서드 생성
      • 타입 메서드 사용
    • 인터페이스
      • sort.Interface 인터페이스
      • 빈 인터페이스
      • 타입 단언과 타입 스위치
      • map[string]interface{} 맵
      • 에러 타입
      • 나만의 인터페이스 만들기
        • Go 인터페이스 사용
        • 3차원 형태 데이터에서 sort.Interface 구현
    • 두 가지 CSV 파일 포맷 다루기
    • Go의 객체지향 프로그래밍
    • 전화번호부 애플리케이션 업데이트
      • CSV 파일 값 설정
      • sort 패키지 사용
    • 연습문제
    • 요약
    • 참고 자료

  • 05장. 패키지와 함수
    • Go 패키지
      • Go 패키지 다운로드
    • 함수
      • 익명 함수
      • 여러 값을 반환하는 함수
      • 함수의 반환값에도 이름을 붙일 수 있다.
      • 함수를 매개변수로 받는 함수
      • 함수를 반환하는 함수
      • 가변 인수 함수
      • defer 키워드
    • Go 패키지 직접 만들기
      • init() 함수
      • 실행 순서
    • 깃허브에 Go 패키지 저장
    • 데이터베이스를 다루는 Go 패키지
      • 데이터베이스 이해
      • Go 패키지 저장
      • Go 패키지의 설계
      • Go 패키지 구현
      • Go 패키지 테스트
    • 모듈
    • Go 패키지를 잘 만드는 방법
    • 문서화
    • 깃랩 러너
      • 초기 설정 파일
      • 최종 설정 파일
    • 깃허브 액션
      • 깃허브에 시크릿 저장
      • 최종 설정 파일
    • 버전 부여
    • 연습문제
    • 요약
    • 참고 자료

  • 06장. 유닉스 시스템에게 작업 지시
    • stdin, stdout, stderr
    • 유닉스 프로세스
    • 유닉스 시그널 처리
      • 두 가지 시그널 처리
    • 파일 입출력
      • io.Reader와 io.Writer 인터페이스
      • io.Reader와 io.Writer의 사용과 오용
      • 버퍼를 이용한 파일 입출력과 버퍼를 이용하지 않는 파일 입출력
    • 텍스트 파일 읽기
      • 줄 단위로 텍스트 파일 읽기
      • 단어 단위로 텍스트 파일 읽기
      • 문자 단위로 텍스트 파일 읽기
      • /dev/random 읽기
      • 파일에서 원하는 만큼만 데이터 읽기
    • 파일 쓰기
    • JSON 데이터 다루기
      • Marshal()과 Unmarshal()
      • 구조체와 JSON
      • 스트림 형태로 JSON 데이터 읽고 쓰기
      • JSON 레코드 출력 다듬기
    • XML 다루기
      • JSON과 XML 변환
    • YAML 다루기
    • viper 패키지
      • 커맨드라인 플래그 사용
      • JSON 설정 파일 읽기
    • cobra 패키지
      • 세 개의 커맨드가 있는 유틸리티
      • 커맨드라인 플래그 추가
      • 커맨드 앨리어스 생성
      • 하위 커맨드 생성
    • 유닉스 파일 시스템에서 순환 참조 찾기
    • Go 1.16의 새로운 기능
      • 파일 임베딩
      • ReadDir과 DirEntry
      • io/fs 패키지
    • 전화번호부 애플리케이션 업데이트
      • cobra 사용
      • JSON 데이터 저장하고 읽기
      • delete 커맨드 구현
      • insert 커맨드 구현
      • list 커맨드 구현
      • search 커맨드 구현
    • 연습문제
    • 요약
    • 참고 자료

  • 07장. Go의 동시성
    • 프로세스, 스레드, 고루틴
    • Go 스케줄러
      • GOMAXPROCS 환경 변수
      • 동시성과 병렬성
    • 고루틴
      • 고루틴 생성
      • 고루틴 여러 개 생성
      • 고루틴이 끝날 때까지 기다리기
      • Add()와 Done()의 호출 횟수가 일치하지 않는 경우
      • 고루틴으로 여러 파일 생성
    • 채널
      • 채널에 데이터 쓰고 읽기
      • 닫힌 채널에서 데이터 받기
      • 함수 매개변수로 지정한 채널
    • 경쟁 상태
      • Go 경쟁 상태 감지기
    • select 키워드
    • 고루틴 타임아웃
      • main() 내부에서 고루틴 타임아웃
      • main() 바깥에서 고루틴 타임아웃
    • Go 채널 다시 보기
      • 버퍼 채널
      • nil 채널
      • 워커 풀
      • 시그널 채널
        • 고루틴의 실행 순서 지정
    • 공유 메모리와 공유 변수
      • sync.Mutex 타입
        • 뮤텍스를 해제하는 것을 잊어버렸을 경우
      • sync.RWMutex 타입
      • atomic 패키지
      • 고루틴으로 메모리 공유
    • 클로저 변수와 go 구문
    • context 패키지
      • context를 키/값 저장소로 사용
    • semaphore 패키지
    • 연습문제
    • 요약
    • 참고 자료

  • 08장. 웹 서비스 만들기
    • net/http 패키지
      • http.Response 타입
      • http.Request 타입
      • http.Transport 타입
    • 웹 서버 생성
    • 전화번호부 애플리케이션 업데이트
      • API 정의
      • 핸들러 구현
    • 프로메테우스로 메트릭 노출
      • runtime/metrics 패키지
      • 메트릭 노출
        • Go 서버의 도커 이미지 생성
        • 메트릭 노출
      • 메트릭 읽기
      • 프로메테우스에 메트릭 넣기
      • 그라파나에서 프로메테우스 메트릭 시각화
    • 웹 클라이언트 개발
      • http.NewRequest()를 사용해 클라이언트 개선
      • 전화번호부 서비스의 클라이언트 만들기
    • 파일 서버 만들기
      • 전화번호부 애플리케이션에서 다운로드하기
    • HTTP 연결 타임아웃 설정
      • SetDeadline() 사용
      • 클라이언트에서 타임아웃 설정
      • 서버에서 타임아웃 설정
    • 연습문제
    • 요약
    • 참고 자료

  • 09장. TCP/IP와 웹소켓
    • TCP/IP
      • nc(1) 커맨드라인 유틸리티
    • net 패키지
    • TCP 클라이언트 개발
      • net.Dial()을 이용한 TCP 클라이언트 개발
      • net.DialTCP()를 이용해 TCP 클라이언트 개발
    • TCP 서버 개발
      • net.Listen()을 이용한 TCP 서버 개발
      • net.ListenTCP()를 사용한 TCP 서버 개발
    • UDP 클라이언트 개발
    • UDP 서버 개발
    • 동시성 있는 TCP 서버 개발
    • 유닉스 도메인 소켓
      • 유닉스 도메인 소켓 서버
      • 유닉스 도메인 소켓 클라이언트
    • 웹소켓 서버 개발
      • 서버 구현
        • websocat 사용
        • 자바스크립트 사용
    • 웹소켓 클라이언트 개발
    • 연습문제
    • 요약
    • 참고 자료

  • 10장. REST API
    • REST 소개
    • RESTful 서버 및 클라이언트 개발
      • RESTful 서버
      • RESTful 클라이언트
    • 실제로 작동하는 RESTful 서버 개발
      • REST API
      • gorilla/mux
      • 서브라우터 사용
      • 데이터베이스 사용
      • restdb 테스트
      • RESTful 서버 구현
      • RESTful 서버 테스트
        • GET 핸들러 테스트
        • POST 핸들러 테스트
        • PUT 핸들러 테스트
        • DELETE 핸들러 테스트
    • RESTful 클라이언트
      • 커맨드라인 클라이언트 구조 갖추기
      • RESTful 클라이언트 커맨드 구현
      • RESTful 클라이언트 사용
      • 여러 REST API 버전 사용
    • 바이너리 파일 업로드와 다운로드
    • REST API 문서화를 위한 스웨거
      • REST API 문서화
      • 문서 파일 생성
      • 문서 파일 제공
    • 연습문제
    • 요약
    • 참고 자료

  • 11장. 코드 테스팅과 프로파일링
    • 코드 최적화
    • 코드 벤치마킹
      • 더 나은 테스트를 위한 main() 함수 재작성
      • 쓰기 및 읽기 버퍼 벤치마킹
      • benchstat 유틸리티
      • 잘못 작성한 벤치마크 함수
    • 코드 프로파일링
      • 커맨드라인 애플리케이션 프로파일링
      • HTTP 서버 프로파일링
      • Go 프로파일러의 웹 인터페이스
    • go tool trace 유틸리티
      • 클라이언트에서 웹 서버 추적
      • 웹 서버의 모든 경로 방문
    • Go 코드 테스트
      • ./ch03/intRE.go 테스트 작성
      • TempDir() 함수
      • CleanUp() 함수
      • testing/quick 패키지
      • 테스트 타임아웃
      • 코드 커버리지 테스트
      • 도달할 수 없는 코드 찾기
    • 데이터베이스 백엔드를 갖춘 HTTP 서버 테스트
    • 퍼즈 테스트
    • 크로스컴파일
    • go:generate
    • 예제 함수 생성
    • 연습문제
    • 요약
    • 참고 자료

  • 12장. gRPC
  • gRPC 소개
    • 프로토콜 버퍼
  • 인터페이스 정의 언어 파일 작성
  • gRPC 서버 개발
  • gRPC 클라이언트 개발
    • 클라이언트를 이용한 gRPC 서버 테스트
  • 연습문제
  • 요약
  • 참고 자료

  • 13장. 제네릭
    • 제네릭 소개
    • 제약 조건
      • 제약 조건 만들기
    • 제네릭을 이용한 데이터 타입 정의
      • Go 구조체에서의 제네릭 사용
    • 인터페이스와 제네릭
    • 리플렉션과 제네릭
    • 연습 문제
    • 요약
    • 참고 자료

  • 부록A. Go 가비지 컬렉터
    • 힙과 스택
    • 가비지 컬렉션
      • 삼색 알고리듬
      • Go 가비지 컬렉터의 상세한 동작 방식
      • 맵, 슬라이스와 Go 가비지 컬렉터
        • 슬라이스 사용
        • 맵에 포인터 사용
        • 포인터를 사용하지 않는 맵 사용
        • 맵 나누기
      • 예제 성능 비교
  • 도서 오류 신고

    도서 오류 신고

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

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

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

    정오표

    정오표

    [p.90 : 아래에서 7행]
    2장을 시장한다.
    ->
    2장을 시작한다.

    [p.135 : 그림 2.2]

    [p.139 : 8행]
    // 아래 변화는 S12에 영향을 주지 않는다.
    ->
    // 아래 변화는 S12에 영향을 준다.

    [p.140 : 그림 2.3]

    [p.143 : 7행]
    nterface
    ->
    Interface

    [p.176 : 13행]
    매칭하고 싶은 문자열은 ? 또는 +로 시작하고
    ->
    매칭하고 싶은 문자열은 - 또는 +로 시작하고

    [p.401 : 11행]
    rootCmd.PersistnetFlags()를 사용해
    ->
    rootCmd.PersistentFlags()를 사용해