# 변수
* var : 변수 선언 키워드
* x : 변수 이름
* int : 변수 타입
* y라는 이름의 int 타입 변수를 100으로 초기화
* 변수 세 가지(x, y, z)를 순서대로 100, 200, 300으로 초기화
* 변수에 초기값을 주지 않으면 제로 값을 가짐
* 제로 값 :
- 숫자형의 경우 0
- bool타입의 경우 false
- string의 경우 ''(비어 있는 문자열)
# 상수
* const : 상수 선언 키워드
* x, y : 상수의 이름
* int, string : 상수의 타입
* 100, "Go" : 상수의 값
* Go언어는 10이 할당되면 int 타입이고 "Go"가 할당되면 string이라는 것을 자동으로 추론함
* const( ) : ( ) 안에 여러 개의 상수를 한 번에 초기화할 수 있음
# 데이터 타입
* boolean
* string : immutable(불변) 타입
* int : int, int8, int16, int 32, int64, uint, uint8, uint16, uint32, uint64, uintptr
* float 및 복소수 : float32, float64, complex64, complex128
* 기타 : byte( = uint8, 바이트 코드에 사용됨), rune( = int32, 유니코드 코드 포인트(코드에 부여된 숫자)에 사용)
# 문자열
* ` `(백틱), " "(이중 인용)을 통해 표현
* ` `으로 만든 문자열은 입력한 그대로 출력됨(\n과 같은 개행 문자로 그대로 \n으로 출력되고 엔터를 치면 줄 바꿈)
* " "으로 만든 문자열은 이스케이프 문자 전부 인식
# 포인터 연산자
* & : 주소를 의미
* * : 주소에 있는 값을 의미
* x라는 이름의 변수를 100으로 초기화함
* p라는 변수를 x의 주소로 초기화
* *p는 p에 들어 있는 x의 주소가 가리키는 값을 의미(100)
# 조건문
* { 은 반드시 if와 같은 라인에 위치해야 함
* if의 조건을 ( )로 감싸지 않아도 되지만, 조건식으로 1이나 0과 같은 boolean은 사용할 수 없음
# 반복문
* 1에서 100까지 더한 값을 sum에 넣고 출력
* Go의 for문은 for의 초기값, 조건식, 증감을 감싸는 괄호를 사용하면 애러 발생
* Go는 while문이 없음
* for문의 조건식과 증감식을 사용하지 않으면 while문과 같은 역할
* names 배열이 만들어짐
* names 배열의 범위에서 인덱스와 인덱스에 해당하는 값을 출력함
# 함수
* 함수의 파라미터는 0개 이상 지정해줘야 함
* 파라미터를 지정할 때는 해당 파라미터의 타입도 함께 적어줘야 함
* 함수의 순서는 관계없음
* main함수의 msg 변수에 "Hello" 대입
* say 함수로 msg의 주소를 인자로 보냄
* say 함수에서 msg의 주소를 역참조로 받음
* msg의 주소를 역참조 했으니 msg의 값인 "Hello"가 출력됨
* msg의 주소를 역참조 했을 때 볼 수 있었던 "Hello"를 "Changed"로 변경
* 다시 main 함수의 마지막 줄인 fmt.Println(msg)를 수행하러 돌아옴
* msg의 바뀐 값인 Changed가 출력됨
*... 은 몇 개의 인자를 받을지 모를 때 파라미터의 타입 앞에 적어주는 것
*... 뒤에 오는 타입과 일치하는 인자를 몇 개라도 받을 수 있음
* 여기서는 count와 sum 두 가지를 리턴 값으로 함
* return 값과 일치하는 타입을 for문의 파라미터 옆에 (int, int) 형식으로 적어줌
* Named Return Parameter는 return 값들을 return 파라미터들(count와 total)에 할당하는 역할을 함
* 리턴 파라미터 명과 그 타입을 한 번에 적음
* 즉, 결괏값을 리턴하지 않고 직접 count와 total에 할당하는 것
* retrun 값이 없더라도 return을 생략하면 애러 나니까 써주기
* 함수명이 없는 함수를 익명 함수(Anonymous Function)이라고 함
* 익명 함수를 사용하는 방식은 크게 두 가지
- 함수 전체를 변수에 할당 (여기서 사용한 방식)
- 다른 함수의 파라미터에 직접 정의하는 방식
* sum이라는 이름의 변수에 함수가 할당됨
* 변수 명인 sum이 함수명과 동일하게 취급됨
* sum(파라미터들) 형식으로 함수를 호출할 수도 있음
* add라는 이름의 변수에 익명 함수를 할당하는 방식
* 함수의 파라미터에 직접 익명 함수를 정의하는 방식
* 함수가 다른 함수의 파라미터로 전달되거나 다른 함수의 리턴 값으로 사용될 수 있음
* type문을 통해 함수의 원형을 정의함
* func(x int, y int) int 원형이 계속 반복된다면 type 문을 정의함으로써 함수 원형을 간단히 표현 가능
* 함수 원형을 정의한 후 함수를 타 메서드에 전달하고 리턴 받는 기능을 Delegate라고 함
# 클로저(Closure)
* nextValue() 함수는 int를 리턴하는 익명 함수를 리턴함
* return 반환 값인 익명 함수가 i를 1씩 증가시킴
* i라는 이름을 가진 변수가 익명함수 내부에 있지는 않은 상태
* i가 익명함수 내부에 있지 않기 때문에, 익명함수 바깥의 i := 0은 next()를 호출할 때마다 1씩 증가한 상태를 유지
* next()라는 함수가 i의 상태를 계속 가지고 있음
* anotherNext라는 다른 변수에 nextValue를 할당하면 다시 1부터 시작
* 클로저는 함수 바깥의 변수를 참조하는 함숫값
# 배열
* int 타입의 x라는 이름을 가진 변수
* [2]int, [3]int, [4]int 등 배열의 크기도 int와 함께 타입을 구성하는 요소임
* 배열 크기에 따라 서로 다른 타입으로 인식
* 배열의 초기값을 설정할 수 있음
* 배열의 크기에 따라 값의 개수가 달라짐
* 배열에 몇 개의 값을 넣을지 정확히 모르겠다면 배열크기를 ...으로 해줌
* 배열 크기가 ...이면 원하는 만큼의 요소만 넣어줄 수 있음
* [2][3][4]의 의미
- 크게 두 덩어리
- 두 덩이 안에 세 덩어리
- 세 덩어리 안에 네 개의 원소
=> [[[0 0 0 0] [0 0 10 0] [0 0 0 0]] [[0 0 0 0] [0 0 0 0] [0 0 0 0]]]
* 2행 3열 배열을 [[1 2 3][4 5 6]]으로 초기화
# 슬라이스
* 슬라이스는 배열을 선언하듯이 함
* 배열과 차이점은 [ ] 안에 아무것도 넣어주지 않는다는 것
* make( ) 함수를 이용해 슬라이스를 선언할 수 있음
* make( ) 함수
- 첫 번째 파라미터에 생성할 슬라이스 타입 지정
- 두 번째 파라미터에 길이(len) 지정 -> 길이는 지금 만들 배열의 길이
- 세 번째 파라미터에 용량(cap) 지정 -> 용량이라는 것은 최대 길이
* 슬라이스의 값을 초기화해주지 않아서 제로 값이 들어감
* 슬라이스의 길이(len)와 용량(cap)을 지정하지 않음
* 길이와 용량을 지정하지 않으면 길이와 용량이 각각 0인 슬라이스가 생성됨
* 길이와 용량이 0인 슬라이스를 nill slice라고 함
* nill slice와 nil을 비교하면 참을 리턴함
cf.) 슬라이스 선언 시 make( ) 함수를 쓰려면 길이와 용량을 지정해주어야 함
* 파이썬의 슬라이싱과 동일
* 마지막 인덱스를 포함하지 않기에 [300 400] 출력
* append 함수의 기능과 이름은 파이썬과 같음
* 파이썬의 append와 사용법은 다름
* append(x , ~~~~~) 이런 식으로 append 함수의 첫 번째 파라미터에 슬라이스의 이름이 들어가고 뒤에 추가하고 싶은 값을 한 개 이상 넣어줌
* 길이가 용량을 초과하면 용량을 기존의 2배로 늘림
* append(슬라이스A, 슬라이스B...)로 슬라이스 추가
* 슬라이스B...에서 ...은 슬라이스B의 모든 요소들의 집합을 나타냄 (여기서는 100, 200, 300)
* int타입의 슬라이스 source 만들기
* int타입이고 길이 3 용량이 6인 타깃 슬라이스 만들기(타깃 슬라이스는 초기화시켜주지 않아서 제로 값이 들어가 있음)
* target슬라이스에 source 슬라이스를 복사해줌
* target 슬라이스를 출력하면 [0 1 2]
* 타깃 슬라이스의 길이와 용량은 각각 3과 6
* 엄밀히 말하면 슬라이스는 실제 배열을 가리키고 있는 포인터에 대한 정보만 있는 것이므로, 해당 정보를 타깃 슬라이스로 복제하는 것
# 맵(Map) - key에 대응하는 value를 신속히 찾는 해쉬 테이블을 구현한 자료구조
* int타입의 키와 string타입의 값을 가지는 myMap이라는 변수를 선언함
* map은 reference타입이므로 nil 값을 가짐 -> Nil Map이라고 부름
* nil map에는 어떤 데이터도 입력 불가능
* map을 초기화하기 위해서는 아래 두 가지 방법 사용
- make( )
- 리터럴을 이용
* make( ) 함수를 사용하여 map을 초기화함
* 리터럴을 이용한 초기화는 map[키타입]값타입 뒤에 {키 : 값} 형식으로 정의
* myMap[키] = "값" 형식으로 key에 대응하는 value를 넣음
* noData변수에 넣어준 key 100은 존재하지 않음
* 존재하지 않는 키에는 nil을 리턴함
* 존재하지 않는 값에 대해 reference 타입은 nil을 리턴하고 value타입의 경우 제로를 리턴함
* delete(맵 변수 이름, 키 값)을 통해 키와 대응하는 값을 삭제
* map의 변수이름[키] 는 키에 대응하는 값을 리턴하고, 키가 존재하는지 bool값도 리턴함
* val 변수에는 아무것도 리턴되지 않고, exists변수에 false가 리턴됨
* Map에 for range를 사용하면 key와 value 두 가지 데이터를 리턴 받을 수 있음
'KOSA 클라우드 솔루션즈 아키텍트 양성과정' 카테고리의 다른 글
[5.24] 오픈스택 (0) | 2022.05.24 |
---|---|
[5.23] 오픈스택 총정리(설치, 설정 등) (0) | 2022.05.23 |
[5.19] Go 4일차 (0) | 2022.05.19 |
[5.18] Go 3일차 (0) | 2022.05.18 |
[5.17] Go 2일차 (0) | 2022.05.17 |