『Go in Action』의 내용을 기반으로 학습 및 정리했습니다.
package
모든 Go 프로그램은 패키지(package)라는 파일 그룹을 통해 관리된다.
모든 .go 파일들은 첫 번째 줄에 자신이 속한 패키지 이름은 선언해야 한다. 같은 패키지 이름을 선언하는 모든 .go파일은 하나의 디렉터리에 저장된다.
main 패키지
모든 실행 가능한 프로그램은 main이라는 패키지를 반드시 가져야 한다. 또한 main 패키지는 프로그램의 진입점 역할을 하는 main()이라는 함수를 선언해야 한다. 그렇지 않으면 실행 바이너리가 생성되지 않는다.
- command (package들을 이용해 실행되는 프로그램 ex- 커맨드 라인 프로그램)
- package (코드를 기능별로 묶는 단위)
package hello
import "fmt"
func main() {
fmt.Println("Hello")
}
패키지 이름이 main이 아닌 다른 이름을 지정한다면 해당 바이너리가 명령(command)이 아닌 패키지(package)라는 내용의 오류가 발생한다. 이는 실행 가능한 프로그램의 조건을 만족하지 못해서이다.
GOPATH
패키지는 Go 환경 변수가 참조하는 디렉터리를 기준으로 한 상대 경로를 탐색한다. 표준 라이브러리 내의 패키지는 Go의 설치 경로를 기준으로 탐색하고, 직접 생성하거나 가져온 패키지는 GOPATH 환경 변수에 지정된 경로가 기준이 된다.
- 분산 버전 관리 시스템(DVCS) - github
- 명명된 가져오기
import "github.com/asdf"
다음과 같은 import를 포함하는 프로그램을 go build하게 되면 GOPATH 경로의 디스크에서부터 탐색을 시작한다. import 경로에 URL이 포함되어 있어도 DVCS로부터 패키지를 가져와 참조하는 경로의 코드를 사용할 수 있다.
Go컴파일러는 패키지를 가져온 후 사용하지 않으면 빌드 수행을 하지 않고 에러를 발생시킨다. 바이너리가 불필요하게 비대해지는 것을 막기 위함이다.
Data collection
1. 배열
Go의 배열은 동일 타입의 원소가 연속 블록에 저장되는 고정 길이 데이터 타입이다. 각 원소는 인덱스로 접근 가능하다.
배열은 값으로 취급되기 때문에 대입 연산자와 함께 사용할 수 있고, 배열을 같은 타입의 다른 배열에 대입할 수 있다.
배열 선언 및 초기화
var array [5]int
저장할 데이터 타입, 저장할 원소 개수를 지정하여 선언한다. 배열은 선언한 후 데이터 타입이나 길이 변경이 불가능하다.
Go에서 변수 선언시 타입에 맞는 제로 값으로 초기화되듯이 배열 내 원소도 해당 타입의 제로 값으로 초기화된다.
- 배열 리터럴로 선언
array := [5] int{10,20,30}
- 자동 길이 배열 선언 (…)
array := [...]int {10,20,30}
- 일부 요소 초기화하는 배열 선언
array := [5]int{1:10, 2:20}
- 배열을 같은 타입 다른 배열에 대입
var array1 [5]string
array2 := [5]string{"Red","Blue"}
array1 = array2

- 포인터 배열을 복사하면 포인터가 가리키는 주소 값이 아닌 포인터 값 자체가 복사된다.
배열 포인터 접근
- 다섯 개 원소를 가지는 정수 포인터 배열 선언
- new 키워드로 int하나 메모리에 생성, 0으로 초기화, 주소 반환
- 반환된 주소 array[인덱스]에 저장
array := [5]*int{0: new(int), 1: new(int)}
*array[0] = 10
*array[1] = 20
다차원 배열
배열의 원소가 또 다른 배열인 형태를 다차원 배열이라고 한다. 주로 행렬이나 테이블 형태의 데이터를 표현할 때 사용한다.
다른 언어의 배열과 동일하게 첫 번째 인덱스는 행(row), 두 번째 인덱스는 열(column)을 의미한다.
var array [4][2] int
함수에 배열 전달
함수에 배열을 전달할 때마다 배열 만큼의 메모리를 스택에 할당한다면 굉장한 비용이 필요하다.
2. 슬라이스
슬라이스(slice)는 배열을 기반으로 만들어진 가변 길이 데이터 구조이다. 배열과 달리 길이를 동적으로 변경할 수 있어 Go에서 가장 많이 사용된다. 슬라이스는 내부적으로 배열을 참조하며 길이(length)와 용량(capacity) 정보를 함께 관리한다.
| 포인터 |
생성 및 초기화
- 슬라이스 리터럴
slice:= []int{10,20,30}
- make 함수 사용
slice:= make([]int,3)
- 배열로부터 생성
array:= [5]int{1,2,3,4,5}
slice:=array[1:4]
append 메서드
슬라이스에 새로운 원소를 추가할 때 사용한다.
slice:= []int{1,2,3}
slice=append(slice,4)
용량이 부족하면 Go 런타임이 새로운 내부 배열을 생성하고 데이터를 복사한다.
3. 맵
맵(map)은 키(key)와 값(value)을 저장하는 자료구조로, 내부적으로 해시 테이블을 사용한다. 키를 이용해 빠르게 데이터를 조회할 수 있다.
ages := map[string]int{
"Tom": 20,
"Jane": 25,
}
해시 테이블
맵은 키를 해시 함수에 통과시켜 저장 위치를 계산한다. 이를 통해 평균적으로 매우 빠른 검색, 추가, 삭제 연산을 제공한다.
age:=ages["Tom"]
생성 및 초기화
- 맵 리터럴
ages:=map[string]int{
"Tom":20,
"Jane":25,
}
- make 함수 사용
ages:= make(map[string]int)
데이터 추가 및 조회
ages["Tom"]=20
age:=ages["Tom"]
존재 여부 확인
Go는 맵 조회 시 값, 존재여부 두 개의 값을 반환한다.
age,exists:=ages["Tom"]
ifexists {
fmt.Println(age)
}
삭제
delete(ages,"Tom")
'Programming > Go' 카테고리의 다른 글
| Go의 동시성 패턴 (0) | 2026.06.14 |
|---|---|
| Go 런타임 스케줄러와 동시성 모델 (1) | 2026.06.07 |
| Go의 타입 시스템 (0) | 2026.06.07 |
| Go의 특징과 핵심 살펴보기 (0) | 2026.05.24 |
