언어 및 도구들 공부/Go

빈 식별자, blank identifier, _

Dr.Mlem 2025. 4. 4. 14:22
data := MyStruct{A: 1, B: 2}

jsonBytes1, _ := json.Marshal(data)   // ✅ OK
jsonBytes2, _ := json.Marshal(&data)  // ✅ 이것도 OK​
Q1.
네가 작성해준 예시 코드, 이거 marshal한 데이터를 json byte 1, 2에 담겠다는 코드 같은데, 이때 _ 로 작성한 부분은, 원래 에러를 담는 위치이지만 에러날 일이 없을테니 그냥 버리고 쓰곘다 이 의미인가?
 
 
 
A1.
💯 완벽하게 이해했어! 너 진짜 Go 감 잘 잡고 있다.
말한 그 부분 정확하게 맞는 해석이야.

✅ 코드 다시 보기

jsonBytes1, _ := json.Marshal(data)

여기서 _는 Go의 **“blank identifier” (빈 식별자)**라고 불려.
즉, "이 자리에 결과가 하나 더 나오지만, 난 그 값을 쓸 생각이 없으니 버릴게요" 라는 의미야.


🔍 json.Marshal(...)의 반환값

이 함수는 다음 두 가지를 리턴해:

func Marshal(v any) ([]byte, error)

반환값 의미
[]byte JSON으로 변환된 데이터
error 마샬 중 오류 발생 여부

📌 그래서 이 코드는

jsonBytes1, _ := json.Marshal(data)

를 해석하면:

📦 "data를 JSON으로 변환한 결과 바이트는 jsonBytes1에 저장하고, 만약 오류가 생기더라도 난 그건 무시할 거야" 라는 뜻이야.


✅ 그럼 실제로는 오류가 날 수 있어?

응! 날 수 있어. 예를 들면:

type Invalid struct {
	FuncField func()  // ← 함수는 JSON으로 변환 불가
}

json.Marshal(Invalid{})  // ❌ 에러 발생

하지만 대부분의 일반 구조체 (int, string, bool 등만 있을 때)는 마샬 실패 확률이 낮기 때문에,
테스트나 예제 코드에서는 _로 에러를 무시하고 써도 무방한 경우가 많아.


✨ 권장 패턴 (실전에서는)

b, err := json.Marshal(data)
if err != nil {
	log.Println("JSON 마샬 실패:", err)
	return
}

실제 프로덕션 코드에선 꼭 에러 확인하는 게 좋아.


✅ 최종 요약

요소 설명
_ Go의 “결과 무시”를 위한 빈 식별자
Marshal(data) JSON 바이트와 에러를 반환
_ := 에러는 무시하고 결과 바이트만 사용하겠다는 뜻
네가 말한 해석 ✔️ 정확해! “에러는 날 일 거의 없으니 무시하고 쓸게요” 맞아!

원하면 _가 Go에서 더 어디에 쓰이는지 (for, range, 다중 리턴 무시 등)도 예제로 보여줄 수 있어!

'언어 및 도구들 공부 > Go' 카테고리의 다른 글

Go) recover()  (0) 2025.04.06
Go) go.mod, go.sum  (0) 2025.04.04
Go) Unmarshal과 포인터  (0) 2025.04.04
Go 포인터 공부 4 - 구조체 포인터로 접근하기  (0) 2025.04.03
Go 포인터 3  (0) 2025.03.29