[Go] 01. Go 시작하기

2023. 12. 28. 18:32Go

반응형
  1. Go
    1. Go?
    2. go 설치
    3. build
  2. Hello world!! 출력 실습

1. Go

1.1. Go?

Go는 2009년에 발표된 오픈소스 프로그래밍 언어입니다.

Go는 쉽고 예외 상황이 적은 문법을 가지고 있는 언어로, 빠른 성능과 일관되고 쉬운 문법이 특징입니다.

시스템 프로그래밍, 백엔드 프로그래밍으로 많이 사용됩니다.

아래와 같은 주요 특징을 가지고 있습니다.

  • 클래스 대신 (메서드를 가지고 있는) 구조체를 지원
  • 상속 지원 x
  • 인터페이스는 있다
  • 함수 리터럴(익명함수) 제공
  • 고성능 가비지 컬렉터 제공
  • 메모리 주소를 가리키는 포인터가 있다
  • 제네릭 지원 x
  • 네임스페이스 제공 x. 모든 코드는 패키지 단위로 분리됩니다
  • 정적 컴파일 언어
  • 강타입 언어

Go는 가비지 컬렉터를 제공하지만, 가비지 컬렉터가 있는 언어중 상위 성능을 가지고 있다.

가비지 컬렉터는 메모리에서 불필요한 영역을 치워줍니다.

  • 가비지 컬렉터가 없는 언어
    • 프로그래머가 직접 메모리 할당과 해제를 책임져야 합니다.
    • 할당한 메모리를 해제하지 않아서 메모리 누수 현상이 발생되거나
    • 이미 해제한 영역을 다시 해제하여 버그가 발생할 수 있습니다.
    • 비교적 더 빠른 성능
  • 가비지 컬렉터가 있는 언어
    • 메모리 해제를 자동으로 해주기 때문에 메모리 관련 문제가 줄어든다
    • 메모리 청소에 CPU 성능을 사용한다는 단점이 있다

정적 컴파일 언어로, 컴파일 과정을 거쳐 실행 파일을 미리 만들어야 하지만 대시 실행 속도가 빠르다.

강타입 언어로, 타입에 의한 문제가 발생되지 않는다.

정적 컴파일 언어?
컴파일한 결과물인 실행파일을 사전에 만들어두고 사용하는 방식의 언어


1.2. go 설치

Go 공식페이지 에 들어가서 OS에 맞는 파일을 다운로드 받고

터미널에서 go version명령어 실행시, 버전정보가 출력되면 go 설치가 완료된 것입니다.

go version
go version go1.21.5 darwin/arm64

1.3. build

Go언어의 모든 코드는 패키지 단위로 작성합니다. (1.16 이후 버전)

내가 위치되어있는 가장 가까이 있는 디렉토리를 패키지로 간주합니다.

예를들어

goplayground/content/notice 구조에서,

content 하위에있는 go 파일의 모듈명은 goplayground/content 이고,
notice 하위에있는 go 파일의 모듈명은 goplayground/content/notice 입니다.


모든 Go코드는 빌드하기 전에 모듈을 생성해야 합니다.
아래와 같은 형식으로, 모듈을 생성한 후, build하면 되는데

go mod init goplayground/content

모듈 생성 명령어를 실행하고나면, 모듈내에 go.mod라는 파일이 생성됩니다.
파일 내에는 모듈명과 Go버전, 필요한 패키지 목록 정보가 담겨져 있습니다.


go build 명령어를 실행하면, 현재 시스템에 맞는 실행파일을 생성해줍니다.
만약, 특정 시스템의 실행파일을 만들고 싶다면, 아래와 같이 GOOS, GOARCH 옵션을 직접 지정하여 build하면 됩니다.

GOOS=linux GOARCH=amd64 go build

빌드에 설정할 수 있는 GOOS, GOARCH 목록은 아래 명령어를 통해 확인할 수 있습니다.

go tool dist list
aix/ppc64
android/386
android/amd64
android/arm
android/arm64
darwin/amd64
darwin/arm64
dragonfly/amd64
freebsd/386
freebsd/amd64
freebsd/arm
freebsd/arm64
freebsd/riscv64
illumos/amd64
ios/amd64
ios/arm64
js/wasm
linux/386
linux/amd64
linux/arm
linux/arm64
linux/loong64
linux/mips
linux/mips64
linux/mips64le
linux/mipsle
linux/ppc64
linux/ppc64le
linux/riscv64
linux/s390x
netbsd/386
netbsd/amd64
netbsd/arm
netbsd/arm64
openbsd/386
openbsd/amd64
openbsd/arm
openbsd/arm64
plan9/386
plan9/amd64
plan9/arm
solaris/amd64
wasip1/wasm
windows/386
windows/amd64
windows/arm
windows/arm64

2. Hello jiniworld!! 출력 실습

2.1. Hello jiniworld!! 실습

먼저, 프로젝트를 생성합니다.
프로젝트 이름은 goplayground로 생성하였습니다.

프로젝트 안에 hello 디렉토리를 만들고, 그 안에 hello.go 파일을 생성하여, 아래의 코드를 작성합니다.

package main

import "fmt"

func main() {
	fmt.Println("Hello jiniworld!!")
}

Go 1.16 버전부터 Go 모듈을 사용하는 것이 기본형태로 되었습니다.

Go 1.16 이전 버전에서는 Go모듈을 사용하지 않는 코드는 $GOPATH/src 아래에 위치시키면 되었지만, 이제는 무조건 모든 코드들을 Go모듈 아래에 위치시켜야합니다.

hello.go 코드의 경우, hello 모듈 아래에 위치되어있습니다.


hello 모듈로 이동하고나서, 모듈을 초기세팉 해줍니다.

cd hello

go mod init goplayground/hello
go: creating new go.mod: module goplayground/hello
go: to add module requirements and sums:
        go mod tidy

모듈 초기화를 마쳤다면, 빌드를 할 수 있습니다.
Go 모듈을 초기화 하면 실행파일이 생성됩니다.

go build


실행파일을 실행해보면, Hello jiniworld!!가 출력됩니다.

./hello
Hello jiniworld!!

go run 명령어를 이용하면 빌드하지 않고 파일을 바로 실행할 수 있습니다.

go run hello.go
Hello jiniworld!!

2.2. 코드 설명

package main

import "fmt"

func main() {
	fmt.Println("Hello jiniworld!!")
}

Go언어의 모든 코드는 패키지 선언으로 시작합니다.

이 코드가 main패키지에 속해있는 코드임을 Go컴파일러에게 알려줍니다. (ln 1)
main 패키지는 프로그램의 시작점을 포함하는 특별한 패키지로, main 패키지를 선언했을 경우 반드시 main함수를 작성해야합니다.

다른 패키지에서 제공하고 있는 기능을 사용하고 싶을 때에는 import를 사용하면 됩니다.
fmt는 표준 입출력을 내장하고 있는 내장 패키지입니다.(ln 3)

main함수는 프로그램의 진입점 함수입니다. Go로 만든 프로그램은 main함수에서 시작되고, main함수가 종료되면 프로그램이 종료됩니다.(ln 5-7)

Println은 fmt 패키지에서 포함하고 있는 표준 출력 함수 일종으로, 문자열을 터미널에 출력합니다.(ln 6)


728x90
반응형

'Go' 카테고리의 다른 글

[Go] 07. 배열, 구조체  (1) 2024.01.17
[Go] 06. if문, switch문, for문  (0) 2024.01.16
[Go] 05. 함수, 상수  (0) 2024.01.15
[Go] 03. fmt - 2. 표준입력  (0) 2024.01.14
[Go] 03. fmt - 1. 출력  (0) 2024.01.14