- [묘공단] 5. fmt Deep Dive2024년 03월 28일
- yeongki0944
- 작성자
- 2024.03.28.:19
[Must Have] Tucker의 Go 언어 프로그래밍
Println → Fprintln 호출
// fmt.Println 함수 func Println(a ...any) (n int, err error) { return Fprintln(os.Stdout, a...) }
Fprintln → newPrinter 객체 생성 → doPrint 호출
func Fprintln(w io.Writer, a ...any) (n int, err error) { p := newPrinter() p.doPrintln(a) n, err = w.Write(p.buf) p.free() return }
// newPrinter allocates a new pp struct or grabs a cached one. func newPrinter() *pp { p := ppFree.Get().(*pp) p.panicking = false p.erroring = false p.wrapErrs = false p.fmt.init(&p.buf) return p }
// doPrintln is like doPrint but always adds a space between arguments // and a newline after the last argument. func (p *pp) doPrintln(a []any) { for argNum, arg := range a { if argNum > 0 { p.buf.writeByte(' ') } p.printArg(arg, 'v') } p.buf.writeByte('\n') }
doPrintln 함수는 pp 타입의 리시버 메서드로, fmt 패키지 내부에서 문자열을 포맷하여 출력하는 데 사용됩니다. 이 함수의 주요 역할은 포맷된 문자열을 생성하고 io.Writer 인터페이스를 따르는 대상에 해당 문자열을 출력하는 것입니다. 아래는 doPrintln 함수의 핵심 코드와 주요 역할에 대한 설명입니다.
// doPrintln 함수 func (p *pp) doPrintln(a []any) { for argNum, arg := range a { if argNum > 0 { p.buf.writeByte(' ') } p.printArg(arg, 'v') } p.buf.writeByte('\n') }
- 매개변수 및 리시버:
- p는 pp 타입의 리시버로, 이 메서드는 pp 타입의 값에 연결됩니다.
- a는 any 타입의 가변 길이 매개변수로, 여러 개의 값들을 포함하고 있습니다.
- 반복문을 통한 값 출력:
- for argNum, arg := range a에서 a에 전달된 가변 인자 슬라이스를 순회합니다.
- argNum은 현재 인자의 인덱스이고, arg는 해당 인덱스에 위치한 값입니다.
- 빈 칸 추가:
- if argNum > 0에서 argNum이 0보다 크면, 즉 첫 번째 인자 이후의 인자일 때, 공백 문자(' ')을 출력합니다.
- 이렇게 함으로써 첫 번째 인자 이후의 인자들 간에는 공백이 추가되어 출력됩니다.
- 인자 출력:
- **p.printArg(arg, 'v')**를 호출하여 현재 순회 중인 인자를 포맷에 맞게 출력합니다.
- **'v'**는 서식 문자열에서 사용되는 서식 지정자로, 값의 기본 형식을 사용하여 출력하도록 지시합니다.
- 줄 바꿈 문자 추가:
- 모든 인자를 출력한 후 **p.buf.writeByte('\n')**를 호출하여 줄 바꿈 문자('\n')를 출력합니다.
- 이로써 모든 값들이 한 줄에 출력된 후 새로운 줄로 이동하게 됩니다.
이 함수는 fmt.Println이 호출될 때 개행 문자('\n')이 포함된 문자열을 생성하고, 해당 문자열을 io.Writer에 출력하는 역할을 합니다. 이때, 각 인자는 p.printArg 메서드를 통해 적절한 서식으로 출력되며, 각 인자 사이에는 공백이 추가됩니다. 최종적으로 줄 바꿈 문자가 추가되어 새로운 줄로 넘어가게 됩니다.
다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)