1. Go가 뭐라고 생각해요?
Go는 요즘 같은 시대에 딱 적합한 언어라고 생각합니다
빠르게 컴파일링 가능하고, 복잡함을 최소화했으며 문법도 간단하고 경량 스레드를 가진 데다가
C와 라이브러리와 네이티브 시스템 호출 등 상호운용성도 챙겼기에 매우 좋은 언어라 생각합니다.
2. Go 프로그램의 패키지를 설명해 주세요?
패키지란 비슷한 기능을 가진 함수, 타입, 변수들이 집합으로 패키지는 코드의 구조를 조직화하고 네임스페이스를 제공하는 역할을 합니다. GO는 패키지로 구성되며 main 패키지에서 실행됩니다.
- go mod init : 모듈을 초기화합니다.
- go get : 외부 모를 가져옵니다.
- go build : 코드를 빌드합니다
3. 사용자 지정 패키지란?
프로젝트 디렉터리 아래에 라이브러리 파일이 있는 디렉터리를 배치하십시오.
프로젝트를 구성하는 작업 공간의 루트에 상대적인 경로를 사용하여 라이브러리를 참조하십시오.
4. GoPath 환경 설정이란?
Go의 workspace 위치를 정의하는 환경 변수입니다. 개발하는 Go 프로젝트에서 import 할 모듈들이 설치 및 관리되는 경로를 지정하는 환경 변수이기도 합니다.
하지만 1.16 버전을 지나면서 모듈 모드를 기본으로 사용하여 이제는 workspace와 상관이 없게 되었습니다.
5. Go에서 Test 방법은?
go test 명령으로 *-test.go 파일에서 함수명이 Test로 시작하는 함수들을 실행할 수 있습니다.
매우 간단하게 테스트가 가능하죠.
6. Go에서 포인터는?
C에서의 포인터 기능과 동일하게 *로 메모리 주소가 가리키는 값을 가져올 수 있습니다
& 키워드로 주소값을 넣어서 포인터 변수를 선언하고 포인터 변수에 * 키워드를 사용해 값을 가져오죠
7. Go에 내장된 자원을 나열해 주세요.
GO에서 사용 가능한 내장 지원에는 다음이 포함됩니다.
- 컨테이너: 컨테이너/목록, 컨테이너/힙
- 웹 서버: net/http
- 암호화: Crypto/md5 , crypto/sha1
- 압축: 압축/gzip
- 데이터베이스: 데이터베이스/sql
8. Goroutine은 무엇이고, 어떻게 사용하나요?
경량 스레드로, 동시성 작업을 쉽게 처리할 수 있게 해줍니다.
go 키워드를 함수 호출 앞에 붙여 간단히 사용 가능합니다.
9. Channel은 무엇이며, 어떻게 사용하나요?
Goroutine들 사이의 통신을 가능하게 하는 동기화 메커니즘입니다.
채널을 통해 데이터를 송수신함으로써 동시성 프로그램에서의 데이터 접근을 안전하게 관리합니다.
10. Go의 인터페이스는 어떤 역할을 하나요?
구체적인 구현을 지정하지 않고 메서드의 집합으로 타입을 정의합니다.
다형성을 지원하며, 유연하고 동적인 코드 작성을 가능하게 합니다.
Go에서는 인터페이스 구현은 덕타이핑으로 구현됩니다.
타입을 명시하지 않아도 인터페이스에서 요구하는 메서드를 구현하면 자동으로 구현하게 됩니다.
type INTERFACE_NAME interface {
METHOD_NAME(PARAMETER_NAME) RETURN_TYPE
...
}
11. Go에서 메모리 관리는 어떻게 이루어지나요?
Go는 자동 가비지 컬렉션을 제공하여 메모리 관리를 단순화합니다.
개발자는 메모리 할당 및 해제에 신경 쓰지 않아도 됩니다.
특징으로는
- 동시성으로 프로그램의 실행과 같이 실행된다
- 저지연으로 애플리케이션의 반응성에 영향을 주지 않는다
- 자동화로 메모리 관리는 완전히 자동으로 됩니다.
12. Go의 슬라이스와 배열의 차이점은 무엇인가요?
배열은 고정된 크기를 가지며, 슬라이스는 동적으로 크기가 변할 수 있는 추상화된 타입입니다.
슬라이스는 배열에 비해 더 유연하게 사용됩니다, 슬라이스의 크기는 넘어갈 경우 2배로 증가합니다.
13. Go에서 포인터의 사용법과 중요성은 무엇인가요?
Go에서 포인터는 값이 아닌 메모리 주소를 참조합니다.
이를 통해 함수에서 변수가 가리키는 메모리의 값을 직접 변경할 수 있습니다.
14. Go에서의 에러 처리 방식에 대해 설명해주세요.
Go에서는 에러를 값으로 반환하여 처리합니다.
error 인터페이스를 사용하여 에러 상황을 명시적으로 다룹니다.
15. Go의 동시성 모델은 어떻게 독특한가요?
Go의 동시성은 CSP(Communicating Sequential Processes) 모델을 기반으로 합니다.
Goroutine과 채널을 사용하여 동시에 실행되는 작업들 사이의 통신을 구현합니다.
CSP란 프로세스들이 채널을 통해 메시지를 주고 받는 통신 방식을 동시성을 구현합니다.
16. Go의 defer 키워드는 어떤 경우에 사용하나요?
함수가 반환하기 직전에 특정 로직을 실행하도록 예약해줍니다.
주로 리소스를 해제하는 작업에 사용됩니다.
17. Go에서의 구조체(struct)와 메서드(method)의 관계는 어떻게 되나요?
구조체는 여러 필드(field)를 갖는 복합 데이터 타입이며,
메서드는 특정 타입에 연결된 함수입니다.
Go는 JAVA같은 전통적인 객체 지향 언어에서 클래스를 사용하는 것과 달리 구조체와 이에 연결된 메서드를 통해 객체 지향 프로그래밍의 많은 특성을 지원합니다.
18. Go의 map 자료구조를 어떻게 사용하나요?
map[KeyType]ValueType 형식으로, 키와 값의 쌍으로 데이터를 저장합니다.
동적으로 요소를 추가하거나 삭제할 수 있으며, 키를 통해 빠르게 값에 접근할 수 있습니다.
19. Go에서의 인터페이스 임베딩은 무엇이고, 왜 사용하나요?
인터페이스 내에 다른 인터페이스를 포함시켜 메서드를 조합하거나 확장할 수 있습니다.
이는 코드 재사용성을 높이고, 복잡성을 관리하는 데 도움을 줍니다.
type Reader interface {
Read(p []byte) (n int, err error)
}
type Writer interface {
Write(p []byte) (n int, err error)
}
// Reader와 Writer 인터페이스의 메소드를 모두 포함하는 ReadWriter 인터페이스
type ReadWriter interface {
Reader
Writer
}
20. Go의 패닉(panic)과 리커버(recover)는 어떤 경우에 사용하나요?
panic 함수는 비정상적인 상황에서 프로그램을 중단시키며,
recover 함수는 패닉 발생 시 프로그램을 복구할 수 있게 합니다.
21. Go의 채널 선택자(select)의 사용 예제를 들어주세요.
select 문을 사용하여 여러 채널의 동시 수신을 대기하고, 준비된 채널에서 통신을 수행할 수 있습니다.
22. Go에서의 패키지 초기화 순서는 어떻게 되나요?
패키지는 소스 파일이 알파벳 순으로 컴파일된 후, 패키지별로 초기화됩니다.
init 함수를 사용하여 초기화 코드를 작성할 수 있습니다.
23. Go에서의 익명 함수와 클로저의 차이점은 무엇인가요?
- 익명 함수는 이름 없이 선언되는 함수입니다.
- 클로저는 주변 범위의 변수를 캡처하여 사용할 수 있는 익명 함수입니다.
24. Go에서의 타입 어설션(type assertion)과 타입 스위치(type switch)는 어떻게 사용하나요?
- 타입 어설션은 인터페이스 값을 특정 타입으로 변환하는 방법입니다.
value, ok := interfaceVariable.(Type)
- 타입 스위치는 여러 타입 어설션을 간결하게 처리할 수 있는 구문입니다.
var i interface{} = 42
switch v := i.(type) {
case int:
fmt.Println("int", v)
case string:
fmt.Println("string", v)
default:
fmt.Println("Unknown type")
}
25. Go에서의 인터페이스 비교시 주의할 점은 무엇인가요?
인터페이스 값은 동적 타입과 동적 값 모두가 nil일 때만 nil입니다.
인터페이스 비교 시 이를 주의해야 합니다.
26. Go의 GC(Garbage Collection) 작동 원리에 대해 설명해주세요.
Go의 가비지 컬렉터는 메모리를 최소화하고, 프로그램의 실행에 방해가 되지 않도록 설계되었습니다.
마크 앤 스위프 알고리즘을 사용하여, 사용되지 않는 메모리를 효율적으로 회수합니다.
27. Go에서의 단위 테스트 방법은 무엇인가요?
Go에서는 testing 패키지를 사용하여 단위 테스트를 작성합니다.
테스트 함수는 Test로 시작하며, go test 명령어로 실행할 수 있습니다.
28. Go에서의 벤치마크 테스트는 어떻게 수행하나요?
testing 패키지를 사용하여 성능 측정을 위한 벤치마크 테스트를 작성할 수 있습니다.
벤치마크 함수는 Benchmark로 시작하며, go test -bench=. 명령어로 실행합니다.
29. Go에서의 태그(tag)를 사용하는 방법과 목적은 무엇인가요?
구조체 필드에 메타 정보를 제공하는데 사용되며, 리플렉션을 통해 실행 시간에 접근할 수 있습니다.
JSON 또는 SQL과 같은 외부 시스템과의 데이터 교환 시 유용하게 사용됩니다.
구조체 내에서 백틱(`)으로 정의할 수 있습니다, json 직렬화때 유용합니다.
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
City string `json:"city,omitempty"`
}
30. Go에서의 고루틴 누수(goroutine leak)를 어떻게 감지하고 방지하나요?
고루틴 누수는 고루틴이 끝나지 않고 계속 실행 상태에 있을 때 발생합니다.
runtime 패키지의 NumGoroutine 함수로 활성 고루틴의 수를 확인하고,
채널이나 컨텍스트를 사용하여 고루틴을 제어함으로써 누수를 방지할 수 있습니다.
31. Go의 컨텍스트(context) 패키지의 사용 예제를 들어주세요.
context 패키지는 요청 사이에 데이터 전달이나, 취소 신호, 타임아웃, 데드라인 등을 전달하는 데 사용됩니다.
고루틴 사이에서 작업 취소 신호를 안전하게 전파하는 데 유용합니다.
32. Go에서의 뮤텍스(mutex)와 채널(channel)을 사용한 동기화 방법의 차이점은 무엇인가요?
- 뮤텍스는 공유 리소스에 대한 동시 액세스를 제어하는 전통적인 동기화 메커니즘입니다.
- 채널은 Go의 동시성 모델에 더 특화되어 있으며, 데이터의 송수신을 통해 동기화를 구현합니다.
33. Go에서의 인터페이스를 사용하는 주요 이유는 무엇인가요?
코드의 유연성과 재사용성을 높이며, 다형성을 구현하고, 느슨한 결합을 가능하게 합니다.
인터페이스를 통해 다양한 구현체를 같은 타입으로 다룰 수 있습니다.
34. Go에서의 패키지 디자인 원칙에 대해 설명해주세요.
간결성, 재사용성, 유지 보수성을 중시하며, 명확한 패키지 명명 규칙과 각 패키지의 단일 책임 원칙을 따릅니다.
35. Go의 최신 버전에서 추가된 주요 기능은 무엇인가요?
Go의 최신 버전에서는 보통 성능 향상, 새로운 언어 기능, 표준 라이브러리의 개선, 개발자 도구의 개선 등이 포함됩니다. 구체적인 기능은 Go의 공식 릴리즈 노트에서 확인할 수 있습니다.
같이 보면 좋은 글 (내 글)
'Go Lang > Study' 카테고리의 다른 글
[GoLang] GraphQL API 만들기 part 1 (라이브러리 탐색) (38) | 2024.03.01 |
---|---|
[GoLang] 반복문에서 고루틴 돌릴 때 주의점 (0) | 2024.01.19 |
[GoLang] Go에서 동시성이란 (1) | 2024.01.15 |
[GoLang] 데드락, 라이브락, 기아상태 이해하기 (Deadlock, Livelock, Starvation) (1) | 2024.01.02 |
[GoLang] Context가 뭘까요? (2) | 2023.12.02 |