본문 바로가기
Go 왕초보 스터디

[묘공단] 5. fmt Deep Dive

by yeongki0944 2024. 3. 28.

[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')
}

 

  1. 매개변수 및 리시버:
    • ppp 타입의 리시버로, 이 메서드는 pp 타입의 값에 연결됩니다.
    • aany 타입의 가변 길이 매개변수로, 여러 개의 값들을 포함하고 있습니다.
  2. 반복문을 통한 값 출력:
    • for argNum, arg := range a에서 a에 전달된 가변 인자 슬라이스를 순회합니다.
    • argNum은 현재 인자의 인덱스이고, arg는 해당 인덱스에 위치한 값입니다.
  3. 빈 칸 추가:
    • if argNum > 0에서 argNum이 0보다 크면, 즉 첫 번째 인자 이후의 인자일 때, 공백 문자(' ')을 출력합니다.
    • 이렇게 함으로써 첫 번째 인자 이후의 인자들 간에는 공백이 추가되어 출력됩니다.
  4. 인자 출력:
    • **p.printArg(arg, 'v')**를 호출하여 현재 순회 중인 인자를 포맷에 맞게 출력합니다.
    • **'v'**는 서식 문자열에서 사용되는 서식 지정자로, 값의 기본 형식을 사용하여 출력하도록 지시합니다.
  5. 줄 바꿈 문자 추가:
    • 모든 인자를 출력한 후 **p.buf.writeByte('\n')**를 호출하여 줄 바꿈 문자('\n')를 출력합니다.
    • 이로써 모든 값들이 한 줄에 출력된 후 새로운 줄로 이동하게 됩니다.

이 함수는 fmt.Println이 호출될 때 개행 문자('\n')이 포함된 문자열을 생성하고, 해당 문자열을 io.Writer에 출력하는 역할을 합니다. 이때, 각 인자는 p.printArg 메서드를 통해 적절한 서식으로 출력되며, 각 인자 사이에는 공백이 추가됩니다. 최종적으로 줄 바꿈 문자가 추가되어 새로운 줄로 넘어가게 됩니다.