C++ 개발자를 위한 Go 언어 요약 정리
C++ 개발자 분이 두꺼운 Go 언어책 모두를 다시 보실 필요 없이 C++ 언어 기반에서 추가로 이해하면 좋은 핵심 내용들만 간추렸습니다.
Go 언어 특징
- Go는 정적 컴파일 언어.
- 컴파일 과정을 거쳐 실행 파일을 미리 만들어야 하지만 실행 속도가 빠릅니다.
- Go는 강 타입 언어입니다.
- 조금 번거롭지만 타입에 따른 문제점이 없습니다.
- Go 언어는 가비지 컬렉터 제공
가비지 컬렉터
Go 언어는 가비지 컬렉터를 제공합니다. 매우 발전된 형태의 가비지 컬렉터를 제공해 성능 손실이 크지 않습니다.
패키지 명 == 폴더 명
Go 모듈 생성
go mod init 명령을 실행하여 모듈 생성
예) go mod init myproject/hello
Go 모듈을 생성하면 go.mod 파일이 생성됩니다.
Go 빌드
go tool dist list 명령으로 빌드 가능한 운영체제와 아키텍처 목록을 볼 수 있습니다.
go build 명령으로 빌드합니다.
package main
main 패키지는 프로그램의 시작점을 포함하는 특별한 패키지입니다.
Go 언어는 패키지 선언으로 시작되어야 합니다.
import
c++의 include와 비슷합니다.
다른 점은 import로 선언한 것이 설치되어 있지 않다면 자동으로 설치를 해 준다는 것입니다.
선언 대입문 :=
선언과 대입문을 한꺼번에 하는 문구입니다. var 키워드와 타입 생략해 변수를 선언할 수 있습니다.
var a int = 3
var b int
var c = 4
d := 5 // d는 int 타입으로 자동 지정됩니다.
e := "hello" // e는 string 타입으로 자동 지정됩니다.
서식 문자
C++과 다른 것들...
%v : 데이터 타입에 맞춰서 기본 형태로 출력합니다.
%T : 데이터 타입 출력
%t : 불리언을 true/false로 출력합니다.
%c : 유니코드 문자를 출력합니다.
%O : 앞에 8진수임을 표시하는 Oo를 붙여서 8진수로 값을 출력합니다.
%q : 특수 문자 기능을 동작하지 않고 문자열 그대로 출력합니다. 예) fmt.Print("%q", "hello\tworld\n");
멀티 반환 함수
다음은 bool과 int를 반환하는 함수의 선언입니다.
func MultiReturn(a, b int) (bool, int)
변수명 지정하여 반환
func MultiReturn2() (result bool, value int)
{
resesult = true
value = 10
}
다양한 switch 문형
// 한 번에 여러 값 비교
switch value
{
case "one", "two" :
...
case "three", "four" :
...
}
// if문 처럼 true가 되는 조건문
value := 10
switch true
{
case value > 1, value < 8 :
...
case value > 9 && vlaue < 15 :
...
}
// switch 초기문, 비교값
switch sum := calcSum(a, b); sum
{
case 10:
...
default:
...
}
// switch 초기문, 비교값 witch true 조건
switch sum := calcSum(a, b); true
{
case sum < 10:
...
default:
...
}
배열
var arr [5]int
var arr [5]int [5]int{1, 2, 3, 4, 5} // 선언과 동시에 초기화
var arr [5]int = [5]int{1:10, 4:40} // index가 1인 곳에 10, index가 4인 곳에 40으로 초기화 나머지는 0
arr := [...]{1, 2, 3} // 배열 3개 1,2,3으로 초기화
// 다중 배열
a := [2][3]int{
{1, 2, 3},
{11, 12, 13},
}
배열 순회 range
var arr [5]int = [5]int{1, 2, 3, 4, 5}
for i, v := range arr
{
fmt.Println(i, v)
}
// 출력 결과
// 0 1
// 1 2
// 2 3
// 3 4
// 4 5
문자열 - 백쿼트(`)
// 특수 문자가 동작하지 않도록 합니다.
str := `Hello\tWorld\n`
fmt.Print(str)
// 출력 결과
// Hello\tWorld\n
rune 타입
UTF-8과 같이 1~3바이트 크기인 문자 하나를 담을 때 사용하는 것이 rune 타입니다.
rune 타입의 크기는 4바이트입니다.
rune 타입 변환으로 글자 수 알아내기
str := "Hello 월드"
runes := []rune(str)
fmt.Printf("%d\n", len(str))
fmt.Printf("%d\n", len(runes))
// 출력 결과
// 12
// 8
유용한 패키지 찾기
모든 것을 스스로 구현할 필요는 없습니다. 이미 구현되어 배포된 패키지가 있는지 먼저 찾아봅시다.
패키지 별칭
import (
"text/template"
htemplate "html/template" // 이름이 겹쳐서 htemplate으로 별칭을 주었습니다.
)
사용하지 않는 패키지 포함하기
import한 패키지를 사용하지 않으면 오류가 발생합니다. 패키지를 사용하지는 않지만 부가효과를 얻고자 하는 경우 밑줄 _을 패키지 명 앞에 붙여주면 됩니다.
import (
"text/template"
_ htemplate "html/template"
)
go mod tidy 명령
Go 모듈에 필요한 패키지를 찾아서 다운로드해 주고 필요한 패키지 정보를 go.mod파일과 go.sum 파일에 적어줍니다.
패키지명과 패키지 외부 공개
패키지 전역으로 선언된 첫 글자가 대문자로 시작되는 모든 변수, 상수, 타입, 함수, 메서드는 패키지 외부로 공개됩니다.
구조체 이름의 첫 글자가 대문자이고 필드명 역시 첫 글자가 대문자인 구조체의 필드 역시 패키지 외부로 공개됩니다.