목차
이미 익숙한 Python과 새로 배우는 Go의 문법/용어를 대조하면서 내용을 정리하고자 한다.
Go vs Python
용법 | Golang | python |
패키지 가져오기 | 1. import [package] 2. import ( [package A] [Package B]/[Package C] ... ) |
1. import [package] 2. from [package] import [module] |
표준출력 | fmt.Println() | print() |
변수선언 | 1. var name [type] 2. var name := [value] 3. const NAME = [value] |
variable = value |
문자열 | 1. 일반 문자열 : "string", 2. raw string : `string` |
1.일반 문자열 : "string" 2.f-string : f"string {var}" |
반복문 | 1. for 초기식; 조건식; 조건 변화식 { 반복 수행할 구문 } 2. for 조건식 3. for 인덱스, 요소값 := range 컬렉션이름 |
for item in iterable: |
조건문 | 1. if 조건식 { } else if 조건식 { } else { } 2. if 짧은 표현식; 조건식 { } else { } |
if 조건: |
분기문 | switch 태그/표현식 { case 라벨/표현식: 수행구문 case 라벨/표현식: 수행구문 ... default 라벨/표현식: 수행구문 } |
|
컬렉션 | 1. Array : var array = [5]int{1,2,3,4,5} 2. Slice : - var my_slice = []int{1,2,3} - my_slice := make([]int, 0, 5) 3. Map : - var my_map = map[string]string{ "key" : "value" } - var my_map = make(map[string]string) |
1. list : my_list = [1,2,3] 2. dict : my_dict = {"key" : "value"} |
slice vs list | 1. 추가 : s = append(s, value) 2. 깊은 복사 : copy(slice_a, slice_b) // a <- b 3. 슬라이싱 : s[1:3] |
1. 추가 : my_list.append(value) 2. 얕은 복사 : new = copy.copy(old) 3. 깊은 복사 : new = copy.deepcopy(old) |
map vs dict | 1. 값 추가 : my_map[key] = value 2. 값 삭제 : delete(my_map, key) 3. 값 확인 : val, exist := my_map[key] |
1. 값 추가 : my_dict[key] = value 2. 값 삭제 : del(dict['key']) 3. 값 확인 : my_dict.get(key, False) |
Null | nil | None |
※ (Python) Module과 Package
패키지(Packages)는 도트(.)를 사용하여 파이썬 모듈을 계층적(디렉터리 구조)으로 관리할 수 있게 해준다.
예를 들어 모듈 이름이 A.B인 경우에 A는 패키지 이름이 되고 B는 A 패키지의 B모듈이 된다.
(출처 : https://wikidocs.net/1418)
※ (Python) iterable, iterator
Iterable, Iterator, Generator는 개념이기도 하며 또한 ABC에 정의되어 있는 추상 클래스이기도 하다.
- 두 클래스는 파이썬의 Iterator Protocol이라는 개념 속에서 정의되는 한 쌍이다.
Iterable은 순회할 수 있는 모든 객체를 가리킨다.
- 다른 말로 하면 파이썬에서 for 문의 in 키워드 뒤에 올 수 있는 모든 값은 Iterable이다.
- 클래스가 Iterable이기 위해서는 __iter__ 추상메소드를 실제로 구현해야 하며
이 메소드는 호출될 때마다 새로운 Iterator를 반환해야 한다.
Iterator는 Iterable에 iter 내장 함수를 적용해 반환되는 객체로서 next 함수를 통해 값을 한 번에 한 번씩 반환하는 특징이 있다.
- 내부적으로 현재까지의 반환 상태를 관리하고 조건에서 정의한 마지막까지 반환하면 더 사용할 수 없으며
StopIteration 예외를 일으킨다.
결론적으로, Iterator는 Iterable이며, Iterator는 Iterable의 자식 클래스이고, Iterable을 상속받는다.
(출처 : https://shoark7.github.io/programming/python/iterable-iterator-generator-in-python#2a)
※ (Go) nil
- zero value는 명시적인 초기값을 할당하지 않고 변수를 만들었을 때 해당 변수가 갖게 되는 값이다.
- nil은 포인터, 인터페이스, 맵, 슬라이스, 채널, 함수의 zero value이다.
(출처 : https://2kindsofcs.tistory.com/3)
Go만의 특징
- Short Assignment Statement(:=) : 별다른 형 선언 없이 타입 추론이 가능
- 선언만 하고 쓰지 않았다면 에러를 발생하며 컴파일에 실패합니다.
- string으로 선언한 문자열 타입은 immutable 타입으로서 값을 수정할 수 없습니다.
- 문자열 타입은 ""와 같이 비어있을 수 있고
다른 언어에서 표현되는 null과 같이 Go언어에서 사용되는 nil이 아닐 수 있습니다. - 형 변환을 할 때 변환을 명시적으로 지정해주어야합니다.
- 조건문의 조건식은 반드시 Boolean 형으로 표현돼야 합니다.
- 두 개 이상의 변수를 모아 놓은 것을 '컬렉션'이라고 합니다.
- 배열은 정적입니다. 즉, 고정된 배열 크기 안에 동일한 데이터를 연속적으로 저장할 수 있다는 뜻입니다.
그래서 크기를 동적으로 증가시키거나 부분 배열을 발췌하는 등의 기능을 가지고있지 않습니다. - 'Slice(이하 슬라이스)'는 배열과 다르게 고정된 크기를 미리 지정하지 않고
이후에 필요에 따라 크기를 동적으로 변경할 수 있고, 부분 발췌가 가능합니다. - 기본적으로 슬라이스는 아무런 값도 초기화하지 않아도 배열의 위치를 가리키는 ptr과
배열의 길이인 len, 전체크기인 cap 메모리를 가지고 있습니다.
예제 코드
(1) Hello Go!
package main
import "fmt"
func main() {
fmt.Println("Hello Go!")
}
(2) 슬라이스 자체가 참조하고 있는 것은 '주소값'이다.
package main
import "fmt"
func main() {
c := make([]int, 0, 3) //용량이 3이고 길이가0인 정수형 슬라이스 선언
c = append(c, 1, 2, 3, 4, 5, 6, 7)
fmt.Println(len(c), cap(c))
l := c[1:3] //인덱스 1요소부터 2요소까지 복사
fmt.Println(l)
l = c[2:] //인덱스 2요소부터 끝까지 복사
fmt.Println(l)
l[0] = 6
fmt.Println(c) //슬라이스 l의 값을 바꿨는데 c의 값도 바뀜
//값을 복사해온 것이 아니라 기존 슬라이스 주솟값을 참조
}
------------------------------------------------------------------
> 7 8
[2 3]
[3 4 5 6 7]
[1 2 6 4 5 6 7]
'Programming > Golang' 카테고리의 다른 글
[번역] Strings, bytes, runes and characters in Go (0) | 2021.07.02 |
---|---|
Golang 기초 - III (0) | 2021.06.30 |
Go 언어 배우기 (I) - 왜, 어떻게? (0) | 2020.05.06 |