언어 및 도구들 공부/Go 23

Go) 패닉이 발생하는 경우, 그리고 recover()

Q1.Go에서 패닉이 일어나는 경우들을 적어줘   A1.Go에서 **panic(패닉)**이 발생하는 경우들은 몇 가지 주요 카테고리로 나뉩니다. 아래는 대표적인 panic 발생 상황들과 예제를 정리한 표입니다:✅ Go에서 패닉(panic)이 발생하는 대표적인 경우상황예시설명1. 배열, 슬라이스, 문자열 인덱스 초과s := []int{1, 2}; fmt.Println(s[5])존재하지 않는 인덱스 접근2. nil 포인터 참조var p *int; fmt.Println(*p)nil을 역참조(dereference)3. map에서 nil 맵에 할당 시var m map[string]int; m["a"] = 1선언만 하고 초기화하지 않은 맵4. 채널에 nil 채널 사용var ch chan int; ch nil 채널에..

Go) GoRoutine, Mutex, Channel, waitGroup

Q1.일단 내가 이해한 내용이야. 1. 고루틴은 한 번에 한 함수를 GO 키워드를 붙여서 여러개 작동시키는 기능.2. waitgroup은 waitgroup에 추가된 고루틴을 끝날때까지 다음 코드로 진행하지 않게 대기시켜주는 기능. 3. Mutex는 특정 요소에 동시에 접근할 때, 해당 요소에 실질적으로는 한 번에 한 번씩만 접근할 수 있게 제한을 거는 기능 이렇게 이해했고, 채널은 해당 코드만 보면 잘 모르겠어. 1. 내가 이해한 내용이 맞는지? 2. 채널을 설명하는 코드를 좀 더 작성해줄래?   A1.네 정리 너무 잘했어!고루틴, WaitGroup, Mutex에 대한 개념 이해는 거의 완벽해.아래에 각각 코멘트 달아볼게:✅ 1. 너의 이해 내용 검토항목너의 설명정확도보출 설명고루틴go 키워드를 붙여서 ..

Go) 변수의 재사용, :=

여기에서 왜 아래의 err에 새 변수로 인식되지 않는거야? ChatGPT의 말:아주 좋은 질문이야!너가 말한 이 코드에서 발생하는 문제는 Go의 변수 선언 범위(scope)와 shadowing 규칙 때문이야.🔍 상황 다시 보기go복사편집// 먼저 여기서 err 선언 hashedPW, err := utils.HashPassword(req.PW) if err != nil { utils.HandleErrResponse(ctx, 500, "700?", "비밀번호 해싱 실패") return } // 그리고 여기서 또 err := ... 로 선언 _, err := db.DB.Exec(query, req.ID, hashedPW) 🔥 왜 문제가 되냐면?Go는 같은 블록(scope) 안에서는 같은 이름의 변수를 :=..

Go) 변수 대문자로 시작하는 경우

Q1.Go에서, 변수인데도 어쩔 때에는 대문자로 시작하는 것 같기도 하더라구. 구조체 안의 변수값으라든가 뭐 이런 특수한 상황에서만 변수의 시작 문자를 대문자로 쓰는건지, 아니면 GO 만의 특별한 규칙이 있는지 잘 모르곘어. 설명해줄래? A1.좋은 질문이야! Go에서 변수 이름을 대문자로 시작하느냐, 소문자로 시작하느냐는 단순 스타일 차이가 아니라, "접근 범위(가시성)"을 결정짓는 중요한 문법 규칙이야. 👇✅ Go의 변수/함수/필드 이름 규칙 핵심이름 시작 문자외부에서 접근 가능?설명대문자 시작 (ID, Name)✅ 공개됨 (exported)다른 패키지에서 접근 가능소문자 시작 (id, name)❌ 비공개 (unexported)해당 패키지 내에서만 사용 가능🔍 예를 들어📦 패키지 model에 구조..

Go) 리플렉션 기반 동적 함수 생성

func makeSum(fptr interface{}){ // fptr은 왜 포인터인가? 여기서 선언된 내용 자체만으로 보면, fptr은 포인터라고 정해져있지 않으나, // 포인터가 아닌 값이 들어오면 아래의 코드가 참조되지 않기에 의미가 없음. fn:=reflect.ValueOf(&ptr).Elem() v:= reflect.MakeFunc(fn.Type(), sum) fn.Set(v)}​다시 돌아와서,var intSum func(int, int) int64 이런 타입의 함수가 있는데makeSum(&intSum) 이렇게 되면fmt.Println(intSum(1, 2)) 왜 이게 3이 되는지 알고 싶어. 코드의 진행 과정을 하나하나 짚어줘. 1. 왜 makeSum에 변수의 포인터를 참조시켰는지..

Go) 구조체와 태그

구조체에 붙이는 태그라는건 뭐야? ChatGPT의 말:좋아, 아주 좋은 질문이야! 👏Go의 **구조체(struct)에 붙이는 태그(tag)**는구조체 필드에 메타데이터(데이터에 대한 정보)를 문자열 형태로 붙여서,리플렉션(reflection)으로 읽어 쓸 수 있게 해주는 기능이야.✅ 구조체 태그란?구조체 정의할 때 필드 옆에 붙이는 백틱(```) 안의 문자열이 태그야.type Person struct { Name string `json:"name"` Age int `json:"age"`}위 예제에서:"json:\"name\"" → 이게 태그임!이건 "JSON으로 인코딩하거나 디코딩할 때 이 필드를 name이라는 키로 매핑해라"는 뜻이야.📌 태그의 형식태그는 일반적으로 다음 형태로 작성돼:`키이..

Go) interface와 type assertion

A1.좋아! 😎지금부터 interface{}(빈 인터페이스)와 일반 인터페이스 타입(예: io.Reader, fmt.Stringer 등)의 차이점을 명확히 정리해줄게!✅ 먼저 정리부터!구분interface{}일반 인터페이스( fmt.Stringer, io.Reader 등)의미빈 인터페이스메서드를 요구하는 인터페이스메서드없음특정 메서드가 반드시 구현돼야 함어떤 타입이 담기나?모든 타입해당 인터페이스를 구현한 타입만유연성매우 높음 (모든 타입 수용)제한적 (명시된 메서드 구현 필요)사용 예fmt.Println, sync.Pool, JSON 처리 등I/O, 문자열 출력, 인터페이스 기반 설계 등🔍 interface{}: 빈 인터페이스func anything(v interface{}) { fmt.Printl..

Go)pool과 빈 interface

package mainimport ( "fmt" "math/rand" "runtime" "sync")type Data struct{// Data 구조체 tag string // 풀 태그 buffer []int // 데이터 저장용 슬라이스}func main(){ runtime.GOMAXPROCS(runtime.NumCPU()) pool := sync.Pool{ // 풀 할당 New: func() interface{} { // Get 함수를 사용했을 때 호출될 함수 정의 data := new(Data) // 새 메모리 할당 data.tag = "new" // 태그 설정 data.buffer = make([]int, 10) // 슬라이스 공간 할당 return data // 할..

Go) for 와 range

Q1.for i := range "어떤 집합" 이렇게 하면 해당 반복문은 어떤 집합의 길이만큼 하는 것이고,거기서 i는 반복문의 횟수를 의미하는거지?    A1.정확해! 💯너 지금 Go의 for i := range 어떤집합 문법을 정확하게 이해하고 있어.그 내용을 한 번 깔끔하게 정리해줄게 👇✅ for i := range 어떤집합 의 의미for i := range 어떤집합 { fmt.Println(i)}이 문법은:해당 집합의 길이만큼 반복하면서, 인덱스(또는 키)만 꺼내는 반복문이야!i는 반복 횟수를 의미한다기보다는,**"해당 집합의 인덱스 또는 키"**를 의미해배열(slice), 맵(map), 문자열(string) 등 다양한 집합 타입에서 사용할 수 있어📌 예제: 슬라이스일 경우arr := []s..

Go) 클로저 캡처 문제 + 고루틴 동작 순서

package mainimport ( "fmt" "runtime")func main(){ runtime.GOMAXPROCS(1) s:= "hello world" for i:=0; iQ1.난 이 코드 출력이 99, 0, 1,2,3, 이 순서인데 뭐가 문제지?    A1.좋아! 지금 네가 겪고 있는 출력 순서의 혼란은,Go의 고루틴(goroutine)과 익명 함수 클로저의 동작 원리 때문에 생긴 아주 대표적인 예야.질문 핵심은:왜 고루틴을 100개 실행했는데 출력이 0부터 순서대로가 아니고, 99, 0, 1, 2, ... 식으로 이상한 순서로 출력되는가?✅ 핵심 결론 먼저너의 코드는 동시성 + 비결정성 + fmt.Scanln() 전까지 실행 순서가 보장되지 않음클로저 안에서 i 값을 바로 넘기지 않으면 헷갈..