Go(17)
-
[Go] 19. 테스트와 벤치마크
1. 테스트 Golang 에서는 테스트를 지원하고 있습니다. go test 명령을 이용하여 테스트 코드를 실행할 수 있으며, 아래와 같은 표준 규약을 가지고 있습니다. 파일명이 _test.go 로 끝납니다 테스트 코드는 func TestXxxxx(t *testing.T) 형태의 함수로 작성합니다 testing 패키지 import 테스트 함수의 매개변수는 t *testing.T 하나여야 합니다 1.1. 테스트 실행 1.1.1. 테스트 전체 실행 ex28.1.go 라는 이름으로 아래와 같은 간단한 예제코드를 작성하였습니다. package main import "fmt" func power(num int) int { return num * num } func main() { n := 5 result := po..
2024.03.13 -
[Go] 18. 채널
channel은 고루틴간에 메시지를 전달하는 메시지 큐입니다. 1. 기본 문법 채널 인스턴스는 make() 내장함수로 만들 수 있습니다. var 변수명 chan 채널타입 = make(chan 채널타입) 채널에 데이터를 넣기 위해서는
2024.03.12 -
[Go] 17. 고루틴
고루틴은 경량 스레드로, 함수 or 명령을 동시에 실행할 때 사용합니다. main() 함수는 고루틴에 의해 실행되는 함수로, Go 프로그램은 최소 1개 이상의 고루틴으로 구성되어있습니다. 원래의 CPU코어는 한번에 하나의 명령을 수행하지만, 컨텍스트 스위칭을 이용하여 여러개의 스레드를 전환하며 실행할 수 있습니다. 다만, 컨텍스트 스위칭은 스레드 전환 이전에 instruction pointer(명령 포인터), 스택 메모리 등의 정보를 저장하여 작업중인 스레드를 기록하는 과정을 거치고, 복원하는 일을 거치는데 이러한 부분에 의해 컨텍스트 스위칭 비용 이 발생되게 됩니다. CPU코어 수에 비해 스레드 수가 너무 많을시(CPU코어수의 2배이상으로 스레드를 설정), 컨텍스트 스위칭 비용에 의한 성능저하가 발생될..
2024.03.11 -
[Go] 16. 에러 핸들링
1. 에러 반환 에러가 발생할 수 있는 함수의 경우, 함수 내에서 에러를 처리하지 말고, 다중 리턴 성징을 활용하여 에러를 함께 반환하는 것을 추천합니다. 해당 메서드에서 에러가 발생했을 경우, 어떤 에러가 발생된 것인지 알림과 함께 종료 또는 재개를 하도록 코드를 작성하면 좋습니다. package main import ( "bufio" "fmt" "os" ) func ReadFile(filename string) (string, error) { file, err := os.Open(filename) if err != nil { return "", err } defer file.Close() rd := bufio.NewReader(file) line, _ := rd.ReadString('\n&a..
2024.03.10 -
[Go] 15. 자료구조 - list, ring, map
Go에서 map은 기본 내장타입으로 제공하고 있으며, list와 ring은 container 기본 내장 패키지에서 제공하고 있습니다. 1. 리스트 list는 container 내장패키지에서 제공하고 있는 LinkedList 자료구조입니다. type List struct { root Element len int } type Element struct { next, prev *Element list *List Value any } 배열이 연속된 메모리에 데이터를 저장했었다면, 리스트는 불연속된 메모리공간에 데이터를 저장한다는 차이점이 있습니다. 배열은 연속된 메모리 공간에 데이터를 저장하기 때문에 인덱스를 이용한 데이터 접근이 빈번하다면 배열 또는 슬라이스를 이용하는 것이 더 효율적이고 데이터의 삽입과 삭제..
2024.02.05 -
[Go] 14. 함수 고급편
1. 가변 인수 함수 함수의 인수 개수를 고정하지 않는 함수를 가변 인수 함수라고 합니다. fmt 패키지의 Println은 아래와 같이 사용 가능합니다. fmt.Println("Hi") fmt.Println(23, "apple") fmt.Println(3.14, "ABC", 10) Println 함수를 살펴보면, 아래와 같이 ...interface{} 타입을 인수값으로 가지고 있습니다. type any = interface{} func Println(a ...any) (n int, err error) { return Fprintln(os.Stdout, a...) } ... 키워드를 이용하면 가변 인수를 처리할 수 있습니다. func sum(nums ...int) int { result := 0 for _..
2024.02.04