본문 바로가기

KOSA 클라우드 솔루션즈 아키텍트 양성과정

[5.16] Go 1일차

# 개념 # 

 

* 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"

    var x, y = 10, "hello" 
    과 같이 :=과  var 모두 변수 선언에 사용됨
- 함수 밖에서는 사용 불가 = package 레벨에서는 사용 불가
 
*const 사용
  - 상수 : 상수 변수
  - 한 번 대입한 값을 변경할 수 없음
  - 컴파일 시 값이 결정되어야 함, 즉 변수를 대입할 수 없음
  - 리터럴에 이름을 부여하는 방법
 
* 타입 지정 상수와 타입 미지정 상수
  - 프로그래밍 의도
  - 타입 미지정 상수는 리터럴과 같은 취급

# 실습 #

 

Go 버전
GOPATH 환경변수

* 작업 공간의 기본 디렉토리

 

경로 설정

* %path% 다음에 나오는 경로를 기존 path에 추가시키는 것

 

set path

* 기존의 path 확인

 

go 파일에 내용 입력 후 출력

* go run 명령어는 바이너리를 임시 디렉토리에 생성하고 실행함

go 파일에 들어간 내용

 

바이너리 빌드

* go build 명령어를 통해 실행 바이너리 생성

 

* 컴파일된 실행 바이너리를 hello_world라는 이름으로 지정(-o 옵션은 output을 의미)

 

hey 설치

* HTTP 서버의 부하테스트를 위한 도구

 

vs코드에서 띄우기

* 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