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 |