# 개념 #
* scale up vs scale out
- scale up : 직원의 능력을 향상시켜서 더 많은 일을 할 수 있게 하는 느낌
- scale out : 직원의 수를 늘리는 느낌
* Go 작업 공간
- GOPATH 환경 변수
- 작업 공간의 기본 디렉토리 :
- GOPATH=$HOME/go
- GOPATH=%USERPROFILE%\go
cf.) 쉘(shell) :
-명령어와 프로그램 실행 시 사용하는 인터페이스(인터페이스:함수의 인터페이스는 함수 헤더, 접근을 위한 모든 것)
- 커널(kernel)과 사용자간의 다리 역할
* %GOPATH%\bin
%GOPATH%\src
* go 명령어
- go run [go 파일... | go 패키지] : 실행 (임시 실행 파일을 만드는 명령어)
- 작은 프로그램 테스트
- Go를 스크립트 언어처럼 사용 시
- go build [go 파일... | go 패키지] : 실행 파일을 만드는 명령어 (최종 배포본을 실행하는 파일)
- go build hello.go
- go build -o hello_world.exe hello.go
* 서드 파티 Go 도구 설치
- go는 다른 언어와 달리 자신의 코드 저장소를 공유하여 패키지를 직접 다운받고 설치 가능
- ex) go install github.com/rakyll/hey@latest
* 코드 포매딩
- 효율적인 코드 작성을 위함
* go fmt
- 들여쓰기 공백 수정
- 구조체 항목 정렬
- 연산자 주변 적절한 공백 사용 체크
* goimports
- import 문 정리
- 알파벳 순 정렬
- 사용되지 않은 import 삭제
- import 추측(추론) : 100% 정확하지 않음
- enhanced go fmt
- go install golang.org/x/tools/cmd/goimports@latest 를 통해 gotimports 설치
* 세미콜론 삽입 규칙
- go fmt는 이 규칙에 의해 잘못 삽입된 중괄호 {} 는 수정 못함
- Go 컴파일러가 자동으로 문장 끝에 세미콜론을 붙여줌
- 규칙
- 식별자
- 기본 리터럴
- 다음 토큰 중 하나 : break, continue, fallthrough, return, ++, --, }, )
* 린팅 , 베팅
- Effective Go
- https://go.dev.doc/effective_go
* Go 위키 코드 리뷰 규칙
* linter
- 1978년 시작
- 코드가 스타일 가이드를 잘 지켰는지 확인
- 알맞은 변수 이름 지정
- 100% 정확도 아님
* 개발 도구 소개
- 비주얼 스튜디오 코드
- Go 개발을 위한 VS Code 구성
- https://docs.microsoft.com/ko-kr/azure/developer/go/configure-visual-studio-code
* Makefiles (텍스트 파일)
- make 프로그램 필요
* Built-in Basic Types in Go
- byte = uint8
- rune = int32
* 제로 값
- 선언되었지만 값이 할당되지 않은 변수에 0을 할당 (파이썬처럼 반드시 값을 초기화 해줘야 하는 것과 대비됨)
* 보수(complement)
- 보충을 해주는 수
- ex) 7에 대한 10의 보수는 3 -> 7에 3을 보충해줘야 10이 되니까 보충해줘야 하는 수인 3이 보수가 됨
* 정수 타입
- int8 (-128 ~ 127)
- Int16 (-32768 ~ 32767)
- Int32 (-2147483648 ~ 2147483647)
- Int64 (-9223372036854775808 ~ 9223372036854775807)
- uint8 (0 to 255)
- uint16 (0 to 65536)
- uint32 (0 to 4294967295)
- uint64 (0 to 18446744073709551615)
* 리터럴
- 코드에 작성하는 값 그 자체
* 정수 리터럴
- 10진수, 8진수, 16진수, 2진수 => 접두사 이용 (없음, 0o, 0x, 0b)
- 밑줄(underscore) : 정수 리터럴 사이에 입력
* 부동 소수점 리터럴
- 점(.)
- e(E) 지수 표현
- 밑줄 가능
* 룬 리터럴
- 작은 따옴표
- 단일 유니코드 문자, 8비트 8진 숫자, 8비트 16진수 숫자, 16비트 16진수 숫자, 32비트 유니코드
- 이스케이프 시퀀스 : ''\n', '\t', ...
* 문자 리터럴
- 두 가지 방법
- 다만, 리터럴 자체에는 데이터 타입이 없기에
* Go 언어는 실용적 언어 => 리터럴에는 타입이 정해져 있지 않다.
* 불리언(boolean)
- true, false
* 숫자 타입
- 정수 타입
- int가 기본 타입이므로, 특수한 경우가 아니면 int를 사용함
* 특수 정수 타입들
- byte : uint8 보다 선호됨
- int : 플랫폼에 따라서 int32, int64
- uint : 플랫폼에 따라서 uint32, uint64
- rune : int32지만 용도가 다름
- uintptr : 포인터
* 정수 연산자
- 산술연산자의 결과 : 정수
- 복합대입연산자 지원
- 비교 연산자
- 비트 연산자
- 시프트 연산자
- 논리 연산자
* 부동소수 타입
- float32, float64 (기본 타입)
- % (나머지 연산)에 대해서는 정의되어 있지 않음
- 부동소수 변수끼리 ==, != 비교는 가능하나 사용하지 말자 (필요할 때만 쓰고 다른 연산은 int 형으로 하자)
* 복소수 타입
* 문자열과 룬
- 제로 값 : 비어 있는 문자열
- 비교 연산자 가능
- 연결 연산자 (+)
- 불변 (immutable)
- 큰 따옴표
* 룬
- 단일 코드 포인트
- 작은 따옴표
- int32의 별칭
* 명시적 타입 변환
cf.) Explicit vs Implicit
명시적 vs 암시적(암묵적)
=> Manual vs Automatic
* 자동 타입 변환
- 편리하나 변환 규칙이 복잡하고, 예기치 못한 결과를 초래할 수 있음
* Go는 자동 타입 변환 불허
- 의도의 명확성 및 가독성 중시 때문
- 명시적으로 타입 변환해야 함
- 모든 타입 변환 규칙을 외울 필요 없음
* 다른 Go 타입을 불리언으로 취급할 수 없음
- 조건식은 반드시 비교식으로 작성해야 함
* var vs :=
- 변수 선언 스타일에 따른 의도가 존재
- var 키워드
[SYNTAX]
- var 변수 타입 = 값(표현식)
- 값의 타입이 예상가능하면 타입 생략 가능
- 값을 생략하면 타입의 제로 값이 대입
- 값은 타입의 여러 변수 또는 다른 타입의 여러 변수 동시 선언 가능
- 여러 변수의 제로 값 동시 선언 가능
* 다양한 변수를 한 번에 선언
- 선언리스트를 괄호로 묶에서 선언하기
* := 짧은 선언
- var 키워드를 쓰지 함께 쓰지 않음
- 타입을 지정하지 않음
- := 왼쪽에는 새로운 변수만 와야 함
- x, y := 10, "hello"
# 실습 #
* 작업 공간의 기본 디렉토리
* %path% 다음에 나오는 경로를 기존 path에 추가시키는 것
* 기존의 path 확인
* go run 명령어는 바이너리를 임시 디렉토리에 생성하고 실행함
* go build 명령어를 통해 실행 바이너리 생성
* 컴파일된 실행 바이너리를 hello_world라는 이름으로 지정(-o 옵션은 output을 의미)
* HTTP 서버의 부하테스트를 위한 도구
* cmd 창에서 code . 하면 비쥬얼 스튜디오 켜지면서 해당 작업영역으로 이동
* \n과 백틱(`)으로 묶어 엔터 친 것의 결과가 같음
* 다른 정수 타입끼리 연산 안 됨 (mismatched types int8 and int16)
* 몫을 구하는 연산자가 / 한 개
* 변수가 선언되었으나, 사용되지 않아서 빨간줄이 표시됨
* Go는 자동 타입 변환을 허용하지 않음
* int16(y)처럼 명시적으로 타입을 변환해줘야 함
* 값을 초기화 해주지 않아서 제로값(0)이 출력됨
* 같은 타입도 가능하고, 다른 타입도 가능한 여러 변수 동시 선언 기능
* 여러 변수를 선언할 때 한 줄에 선언해도 되지만, 가독성을 향상하기 위해 나눠서 써주는 것이 좋음
* 다양한 변수를 괄호로 묶어서 선언할 수 있음
* reflect.Typeof()에서 () 안에는 하나의 인자만 들어갈 수 있음
'KOSA 클라우드 솔루션즈 아키텍트 양성과정' 카테고리의 다른 글
[5.18] Go 3일차 (0) | 2022.05.18 |
---|---|
[5.17] Go 2일차 (0) | 2022.05.17 |
[5.13] Python 5일차 (0) | 2022.05.13 |
[5.12] Python 4일차 (0) | 2022.05.12 |
[5.11] Python 3일차 (0) | 2022.05.11 |