『Go in Action』의 내용을 기반으로 학습 및 정리했습니다.

Go의 주요 특징
동시성 (Concurrency)
Go는 goroutine이라는 경량 스레드(lightweight thread)를 제공하여 동시성 프로그래밍을 쉽게 구현할 수 있다.
일반적인 OS 스레드는 생성 비용과 메모리 사용량이 큰 편이지만, 고루틴은 훨씬 가볍게 동작한다. Go 런타임은 여러 고루틴을 OS 스레드 위에 자동으로 스케줄링하며, 사용 가능한 CPU 코어 수를 기준으로 효율적으로 실행을 관리한다.
고루틴은 수천~수만 개까지도 비교적 부담 없이 생성할 수 있으며, 서버 애플리케이션처럼 많은 요청을 동시에 처리해야 하는 환경에서 특히 강력한 장점을 가진다. 오버헤드가 크지 않으니 빈번하게 사용해도 좋다고 한다.

- 고루틴 생성
go func() {
fmt.Println("hello goroutine")
}()
타입 시스템
Go는 인터페이스(interface)를 중심으로 동작을 모델링한다.
다른 객체지향 언어처럼 특정 타입이 인터페이스를 구현한다고 명시적으로 선언하지 않는다. 대신 어떤 타입이 인터페이스에 정의된 메서드 집합(method set)을 만족하면 자동으로 해당 인터페이스를 구현한 것으로 간주한다.
이러한 방식은 흔히 “덕 타이핑(Duck Typing)”과 비슷한 개념으로 설명된다.
“오리처럼 걷고, 오리처럼 소리 낸다면 오리다. 꽥꽥”
중요한 것은 타입 이름이 아니라 “어떤 동작을 할 수 있는가”이다.
interface{}
Go의 interface{}는 모든 타입을 저장할 수 있는 빈 인터페이스이다.
func (dec *Decoder) Decode(v interface{})error
위 코드에서 v interface{}는 어떤 타입의 값이든 전달받을 수 있다는 의미이다.
Go 1.18 이후에는 any가 interface{}의 별칭(alias)으로 추가되었다.
func Decode(v any) error
메모리 관리
Go는 가비지 컬렉션(Garbage Collection, GC)을 제공한다.
개발자가 직접 메모리를 해제하지 않아도 사용하지 않는 메모리를 런타임이 자동으로 정리해준다. 따라서 C/C++처럼 메모리 해제를 직접 관리할 필요가 없다.
Go 프로그램 구조
package 패키지
패키지는 Go 코드의 기본 구성 단위이다.
모든 Go 소스 파일은 반드시 하나의 패키지에 속해야 하며, 같은 폴더 안의 파일들은 동일한 패키지 이름을 사용한다.
package main
func main(){
}
main 패키지는 실행 가능한 프로그램을 의미하며, main() 함수가 프로그램의 시작점(entry point)이 된다.
식별자
빈 식별자(blank identifier)
Go 컴파일러는 import한 패키지를 실제로 사용하지 않으면 컴파일 오류를 발생시킨다.
import (
_ "package/path"
)
_는 빈 식별자(blank identifier)라고 하며, 패키지의 초기화(init)만 수행하고 직접 사용하지 않을 때 사용된다.
식별자(export) 규칙
Go에서는 식별자의 첫 글자가 대문자이면 외부 패키지에서 접근 가능(export)하다.
type User struct {}
반대로 소문자로 시작하면 패키지 내부에서만 사용할 수 있다.
type user struct {}
변수 선언과 초기화
Go의 모든 변수는 선언과 동시에 제로 값(zero value)으로 초기화된다.
|
타입
|
제로 값
|
|
int
|
0
|
|
string
|
“”
|
|
bool
|
false
|
|
pointer
|
nil
|
var 키워드
var age int
단축 변수 선언
초기값이 있는 경우에는 :=를 자주 사용한다.
name := "Go"
reflection 리플렉션
리플렉션(reflection)은 런타임에 타입 정보를 조사하고 값을 동적으로 조작하는 기능이다.
Go의 JSON 패키지처럼 구조체 태그를 읽어 자동으로 데이터를 매핑하는 기능들이 리플렉션을 활용한다.
Go의 핵심 개념
reflection 리플렉션
리플렉션(reflection)은 런타임에 타입 정보를 조사하고 값을 동적으로 조작하는 기능이다.
Go의 JSON 패키지는 구조체 태그(struct tag)를 읽어 JSON 데이터를 자동으로 매핑하는데, 이 과정에서 리플렉션이 사용된다.
type User struct {
Name string `json:"name"`
}
리플렉션은 강력하지만 성능 비용이 존재하므로 필요한 경우에만 사용하는 것이 좋다고 한다.
구조체(struct)
구조체는 여러 데이터를 하나의 타입으로 묶는 기능이다.
type User struct {
Name string
Age int
}
빈 구조체(empty struct)
Go의 빈 구조체는 크기가 0바이트이다.
type defaultMatcher struct{}
func init(){
var matcher defaultMacher
}
빈 구조체는 상태(state)는 필요 없지만 “타입 자체의 의미”가 필요할 때 사용된다.
인터페이스(interface)
인터페이스는 특정 동작의 집합을 정의한다.
type Matcher interface {
Search(feed *Feed, searchTerm string) ()
}
- 인터페이스 명명 규칙
|
메서드 개수
|
규칙
|
|
메서드 1개
|
-er 접미사로 끝나는 이름
|
|
메서드 여러 개
|
동작 중심 이름 사용
|
type Reader interface {}
type Writer interface {}
receiver(수신자)
Go는 구조체에 메서드를 연결할 수 있다.
값 수신자(value receiver)
func (mdefaultMatcher) Search(feed*Feed,searchTermstring) ([]*Result,error){
return nil,nil
}
메서드 호출 시 값이 복사된다.
포인터 수신자(pointer receiver)
func (m*defaultMatcher) Search(feed*Feed,searchTermstring) ([]*Result,error) {
return nil,nil
}
원본 값을 직접 수정할 수 있으며, 큰 구조체 복사를 피할 수 있기 때문에 실제 코드에서는 포인터 수신자를 더 자주 사용한다.
메서드 호출 시 참조/역참조
Go 컴파일러는 메서드 호출 시 필요한 참조(reference)와 역참조(dereference)를 자동으로 수행한다.
- 자동 참조
컴파일러가 자동으로 &dm을 수행한다.
func (m *defaultMatcher) Search(feed *Feed, searchTerm string) {}
var dm defaultMatcher
dm.Search(feed, "test")
- 자동 역참조
컴파일러가 자동으로 *dm을 수행한다.
func (m defaultMatcher) Search(feed *Feed, searchTerm string) {}
dm := new(defaultMatcher)
dm.Search(feed, "test")
channel 채널
채널(channel)은 고루틴 간 안전하게 데이터를 주고받기 위한 자료구조이다.
Go는 공유 메모리를 직접 수정하기보다 채널을 통해 데이터를 전달하는 방식을 권장한다.
"공유 메모리로 통신하지 말고, 통신으로 메모리를 공유하라."
- 채널 생성
results := make(chan *Result)
- 채널 송신
results <- result
- 채널 수신
result := <- results
blocking 특성
채널은 기본적으로 blocking 방식으로 동작한다.
- 송신 시 수신자가 없으면 대기
- 수신 시 송신자가 없으면 대기
이러한 특성 덕분에 고루틴 간 동기화를 자연스럽게 처리할 수 있다.
- 채널 닫기
close(results)
채널이 닫히면 더 이상 데이터를 보낼 수 없다.
range를 이용한 채널 순회
func Display(results chan *Result) {
for result := range results {
log.Printf("%s: \n%s \n\n", result.Field, result.Content)
}
}
range는 채널이 닫힐 때까지 데이터를 계속 수신한다.
'Programming > Go' 카테고리의 다른 글
| Go의 동시성 패턴 (0) | 2026.06.14 |
|---|---|
| Go 런타임 스케줄러와 동시성 모델 (1) | 2026.06.07 |
| Go의 타입 시스템 (0) | 2026.06.07 |
| Package와 Go의 데이터 컬렉션 (0) | 2026.05.31 |