[Go] 기본 특징과 directory 및 패키지

김무연·2025년 1월 17일

GoLang

2007년 구글에서 일하던 켄 톰슨, 롭 파이크 로버트 그리즈머에 의해 개발되었으며, C++의 느린 빌드 속도, 언어의 복잡성, 안정성 확보의 어려움, 동시성 프로그래밍의 어려움에 한계를 느끼고 이를 개선한 Go 언어가 개발되었다.

Go Lang 특징

  1. 구글에 의해 개발되고 관리되는 오픈 소스 언어
  2. 배우기 쉽고, 시작하기 쉬운 언어
  3. 동시성과 강력한 라이브러리들 내장
  4. 성장하는 파트너, 커뮤니티와 도구들
  • 모든 프로그램의 시작은 main 패키지의 main 함수
    1. Go언어의 프로그램은 반드시 main 패키지가 있어야 하며, main 함수가 있어야 한다. 이 main패키지의 main 함수는 모든 프로그램이 시작하는 시작지점이 된다.
      즉 Go는 각각 개별적으로 파일을 실행시킬 수 있는 것이 아닌, main패키지와 main함수를 포함하는 파일이라는 명확한 실행 진입점이 존재를 하게 된다. 때문에 원하는 파일 하나만 독립적으로 실행을 못한다.
package main

func main() {
	println("안녕하세요")
}

import

  1. import 는 다른 패키지의 함수들을 사용할 수 있게 한다
  2. printf와 같은 함수를 사용하고 싶을때 fmt 패키지 내에 종속되어 있기 때문에 해당 패키지를 import 해와서 쓰도록한다.
  3. Go에서는 함수가 대문자로 되어 있어야 export가 된다. 예를 들어 커스텀 함수를 import 시켜 쓰고 싶을때, export할 함수의 첫글자는 무조건 대문자가 되어야 한다. 때문에 주로 Camel Case의 방식을 주로 사용한다
  4. 또한 import의 경로를 입력할 때, 작은 따옴표가 아닌 큰 따옴표로 묶여있어야 한다.
  5. 만약 go.mod에서 모듈 이름이 설정될 경우, 경로는 go.mod에 기입한 module의 이름이 절대 경로가 되며, 앞에 위치 해야 한다.
//something.go
//export할 함수 작성
package something

import "fmt"

func SayHello(){
	fmt.Println("Wassssssup")
	
}

// main.go
// main.go 에서 자동 import 해서 사용 가능
// something이라는 package가 autoimport 됨
package main

import (
	"fmt"
	"main/something"
)

func main(){
	fmt.Println("hello")
	something.SayHello()
}

// 현재 go.mod 에서 module name은 main으로 준 상태

Directory와 Package

  1. Go에서는 Directory가 굉장히 중요하다. 많은 다른 언어들은 실제 디렉토리 역할 이상을 하진 않지만, Go는 패키지와 아주 밀접한 관계가 있기 대문에, 프로그램이 어떻게 작성될지 결정하는 한 부분이 된다.
  2. 그 때문에 디렉토리 구조가 곧 패키지를 어떻게 구성할 것인지를 판단할 수 있게 된다.
  3. Go에서 Package는 go.mod 파일이 있는 모듈의 루트(경로)를 기준으로 한 디렉토리의 하나만 존재할 수 있다. 따라서 한 디렉토리에 여러개의 go 파일은 존재할 수 있지만 package의 이름은 동일해야 한다.
  4. func main()가 진입점 역할을 수행햐며, apckage main 함수에 구현되어 있어, 만약 패키지를 정의하지 않으면 빌드 도구들이 실행파일을 만들지 못한다.
  5. func init()로 패키지가 로드될 때 가장 먼저 호출되는 함수가 존재, 패키지의 초기화 로직이 필요할때 사용한다
└── something
    ├── something1.go
    └── something2.go

// 와 같은 구조로 있다고 하더라도, something1.go와 something2.go의 package name은 동일해야 한다
  • 또한 패키지의 이름은 기본적으로 디렉토리의 이름을 따라가는것이 관례이다.
  • 만약 패키지의 이름이 디렉토리의 이름과 다른 경우 패키지를 호출할 때 Alias를 붙이는것이 관례이다
profile
Notion에 정리된 공부한 글을 옮겨오는 중입니다... (진행중)

0개의 댓글