프로그래밍 일반/Go 프로그래밍

C++ 개발자를 위한 Go 언어 요약 정리

지노윈 2024. 4. 15. 19:09
반응형

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 파일에 적어줍니다.

 

패키지명과 패키지 외부 공개

패키지 전역으로 선언된 첫 글자가 대문자로 시작되는 모든 변수, 상수, 타입, 함수, 메서드는 패키지 외부로 공개됩니다.

구조체 이름의 첫 글자가 대문자이고 필드명 역시 첫 글자가 대문자인 구조체의 필드 역시 패키지 외부로 공개됩니다.