fmt.Printf
를 호출하면 stdout으로 인쇄된다. 이는 테스트 프레임 워크를 사용하여 캡처하기가 매우 어렵다.fmt.Printf
의 소스 코드를 보면 연결하는 방법을 알 수 있다.Printf
는 os.Stdout
을 전달하는Fprintf
를 단지 호출한다.os.Stdout
은 정확히 무엇인가? Fprintf
는 첫 번째 argument로 무엇을 전달받을 것으로 예상하는가?io.Writer
이다.Writer
를 사용하고 있다는 것을 안다. 기존 추상화를 사용하여 코드를 테스트할 수 있고 더 재사용 가능하게 만들어 보자.bytes
패키지의 buffer
type은 Writer
인터페이스를 구현한다.Writer
로서 사용할 것이다. 그리고 Greet
호출한 후에, 무엇이 buffer에 쓰여졌는 지 확인할 수 있다.Hello, Chris di_test.go:16: got '' want 'Hello, Chris'
fmt.Fprintf
는fmt.Printf
와 비슷하지만, 문자열을 보낼 곳 Writer
를 가진다. 반면, fmt.Printf
는 기본적으로 stdout을 사용한다.bytes.Buffer
에 대한 포인터를 전달하라고 했다. 이것은 기술적으로 정확하지만, 그다지 유용하지는 않다.Greet
함수를 표준 출력으로 인쇄하려는 Go 애플리케이션에 연결해보자../di.go:14:7: cannot use os.Stdout (type *os.File) as type *bytes.Buffer in argument to Greet
fmt.Fprintf
는 io.Writer
로 그것을 구현하는 os.Stdout
와 bytes.Buffer
를 전달할 수 있도록 한다.io.Writer
를 사용하여 데이터를 쓸 수 있는 다른 곳이 있는가? 우리의 Greet
함수는 얼마나 general purpose 인가?http.ResponseWriter
와http.Request
를 받습니다. 서버를 구현할 때 writer를 사용하여 응답을 write한다.http.ResponseWriter
또한 io.Writer
를 구현한다고 추측할 것이고 그것이 우리가 handler 내에서 Greet
함수를 재사용할 수 있는 이유이다.io.Writer
인터페이스에 익숙해지면 테스트에서 bytes.Buffer
를 Writer
로 사용할 수 있으며 명령 줄 앱 또는 웹 서버에서 표준 라이브러리의 다른 Writer
를 사용하여 함수를 사용할 수 있다.