Go lang
chap. 01
scale up vs scale out
: 시스템 구성하는 요소가 증가하는 것을 말함
1.1 GO 도구 설치
https://go.dev/
1.2 GO 작업 공간
* GOPATH 환경 변수
* 작업 공간의 기본 디렉터리
: GOPATH=$HOME/GO
GOPATH=%USERPROFILE%\go
cf.) 셸이란 ?
* %GOPATH%\bin
* %GOPATH%\src
1.3 GO 명령어
* go run go 파일....|go 패키지
- 작은 프로그램 테스트
- GO를 스크립트 언어처럼 사용 시
* go build go 파일...|go 패키지
1.3.2 서드 파티 go 도구 설치
*go는 다른 언어와 달리 자신의 코드 저장소를 공유하여 패키지를 직접 다운받고 설치가능
* 예) go install github.com/rakyll/hey@latest
1.3.3 코드 포매팅
* go fmt
- 들여쓰기 공백 수정
- 구조체 항목 정렬
- 연산자 주변 적절한 공백 사용 체크
* goimports
- import 문 정리
- 알파벳 순 정렬
- 사용되지 않은 import 삭제
- import 추측(추론): 100% 정확하지 않음
- enhanced go fmt
- go install 명령으로 설치 필요 (p.28 참조)
* 세미콜론 삽입 규칙
- go fmt는 이 규칙에 의해 잘못 삽입된 중괄호({})는 수정 못함
- Go 컴파일러가 자동으로 문장 끝에 세미콜론을 붙여줌
- 규칙
- 식별자
- 기본 리터럴
- 다음 토큰 중 하나: break, continue, fallthrough, return, ++, ‘--’, }, )
1.4 린팅, 베팅
* Effective Go
* Go 위키의 코드 리뷰 규칙
* linter
- 1978년 시작
- 코드가 스타일 가이드를 잘 지켰는지 확인
- 알맞은 변수 이름 지정
- ...
- 100% 정확도 아님
- 설치(p.31)
1.5 개발 도구 소개
1.5.1 비주얼 스튜디오 코드
* Go 개발을 위한 VS Code 구성
1.5.3 Go Playground
1.6 Makefiles 텍스트 파일
* make 프로그램 필요
chap. 02
2.1 내장 타입
* https://go101.org/article/basic-types-and-value-literals.html
1) 불리언
2) 숫자
- 정수: 주로 int 사용, 경우에 따라 byte
- 실수
- 복소수
3) 문자열
4) 별칭: byte(uint8), rune(int32)
2.1.1 제로 값
* 선언되었으나 값이 할당되지 않은 변수에 기본 값 제로(0) 할당
2.1.2 리터럴
* 코드에 작성하는 값 그 자체
* 정수 리터럴
- 10진수, 8진수, 16진수, 2진수 ⇒ 접두사 이용 (없음, 0o, 0x, 0b)
- 밑줄(underscore): 정수 리터럴 사이에
* 부동 소수점 리터럴
* 룬 리터럴
- 작은 따옴표
- 단일 유니코드 문자, 8비트 8진 숫자, 8비트 16진수 숫자, 16비트 16진수 숫자, 32비트 유니코드
- 이스케이프 시퀀스: ‘\n’, ‘\t’, ...
* 문자 리터럴
- 두 가지 방법
- 1) 해석된 문자열 리터럴: 큰 따옴표 사용
- 2) 로(raw) 문자열: 역따옴표(백틱) 사용
* 다른 타입으로 선언된 두 정수는 연산 불가능
- 하지만, 부동소수점 변수에 정수 리터럴 사용 가능
정수 변수에 부동소수점 리터럴 사용 가능
- 왜냐, 리터럴 자체에는 데이터 타입이 없으므로
* Go 언어는 실용적 언어 => 리터럴에는 타입이 정해져 있지 않다
2.1.3 불리언
* true, false
2.1.4 숫자 타입
* 정수 타입
- 특수한 경우 아니면 int 사용
- int가 기본 타입
* 특수 정수 타입들
- byte: uint8 보다 선호
- int: 플랫폼에 따라서 int32, int64
- uint: 플랫폼에 따라서 uint32, uint64
- rune: int32지만 용도가 다르다
- uintptr: 포인터
* 정수 연산자
- 산술연산자의 결과는 정수
- 복합대입연산자도 지원
- 비교연산자
- 비트연산자
- 시프트연산자
- 논리연산자
* 부동소수 타입
- float32, float64(기본 타입)
- %(나머지 연산)에 대해서는 정의되어 있지 않음
- 부동소수 변수끼리 ==, != 비교는 가능하나 사용하지 말자
* 복소수 타입
2.1.5 문자열과 룬 맛보기
* 문자열
- 제로 값: 비어있는 문자열
- 비교연산자 가능
- 연결연산자(+)
- 불변(immutable)
- 큰 따옴표
* 룬
- 단일 코드 포인트
- 작은 따옴표
- int32의 별칭
2.1.6 명시적 타입 변환
cf.) Explicit vs. Implicit
명시적 vs. 암시적(암묵적)
⇒ Manual vs. Automatic
* 자동 타입 변환
- 편리하나
- 변환 규칙이 복잡, 예기치 못한 결과 초래 가능
* Go는 자동 타입 변환 불허
- 의도의 명확성 및 가독성 중시 때문
- 명시적으로 타입 변환해야 함
-> 모든 타입 변환 규칙을 외울 필요 없음
* 다른 Go 타입을 불리언으로 취급할 수 없다.
2.2 var vs. :=
* 변수 선언 스타일에 따른 의도가 존재
* var 키워드
[SYNTAX]
var 변수 타입 = 값(표현식)
- 값의 타입이 예상가능하면 타입 생략 가능
- 값을 생략하면 타입의 제로 값이 대입
- 같은 타입의 여러 변수 또는 다른 타입의 여러 변수 동시 선언 가능
- 여러 변수의 제로 값 동시 선언 가능
* 다양한 변수를 한 번에 선언
* := 짧은 선언
- var 키워드(X)
- 타입(X)
- 함수 밖에서는 사용 불가 = package 레벨에서 사용 불가
2.3 const 사용
- 상수: 상수 변수
- 한 번 대입한 값을 변경할 수 없다
- 컴파일 시 값이 결정되어야 한다, 즉 변수를 대입할 수 없다.
- 리터럴에 이름을 부여하는 방법
2.4 타입 지정 상수와 타입 미지정 상수
- 프로그래밍 의도
- 타입 미지정 상수는 리터럴과 같은 취급