답변:
니모의 대답을 바탕으로 :
println
언어에 내장 된 함수입니다. 사양 의 부트 스트랩 섹션에 있습니다. 링크에서 :
현재 구현은 부트 스트랩 중에 유용한 몇 가지 내장 기능을 제공합니다. 이러한 기능은 완전성을 위해 문서화되어 있지만 해당 언어로 유지된다는 보장은 없습니다. 결과를 반환하지 않습니다.
Function Behavior print prints all arguments; formatting of arguments is implementation-specific println like print but prints spaces between arguments and a newline at the end
따라서 개발자에게 유용합니다. 왜냐하면 종속성 (컴파일러에 빌드 됨)이 부족하기 때문이지만 프로덕션 코드에는 없습니다. 또한이 사실 print
을 println
기록하고 stderr
, 아니라 에게보고stdout
하는 것도 중요합니다 .
fmt
그러나에서 제공하는 제품군 은 프로덕션 코드로 빌드되었습니다. stdout
달리 지정되지 않는 한에 예상대로보고 합니다. 그들은 더 다양한 (하는 fmt.Fprint*
모든에보고 할 수 io.Writer
같은 os.Stdout
, os.Stderr
또는 심지어 net.Conn
. 형) 및 구현 특정되지 않습니다.
출력에 대한 책임이 있습니다 대부분의 패키지는이 fmt
같은 종속성으로 log
. 프로그램이 프로덕션에서 출력하는 것이 있다면 fmt
원하는 패키지 일 가능성이 큽니다.
여기서 차이점을 볼 수 있습니다.
rangeOverIntsAndStrings (1, 5)
func rangeOverIntsAndStrings(args ...interface{}) {
for _, v := range args {
println(v)
}
}
// 출력
(0x108f060,0x10c5358)
(0x108f060,0x10c5360)
vs
func rangeOverIntsAndStrings(args ...interface{}) {
for _, v := range args {
fmt.Println(v)
}
}
// 출력
1
5
흥미로운 예 :
➜ netpoll git:(develop) ✗ cat test.go
package main
import "fmt"
func main() {
a := new(struct{})
b := new(struct{})
println(a, b, a == b)
c := new(struct{})
d := new(struct{})
fmt.Printf("%v %v %v\n", c, d, c == d)
}
➜ netpoll git:(develop) ✗ go run test.go
0xc000074f47 0xc000074f47 false
&{} &{} true
➜ netpoll git:(develop) ✗ go run -gcflags="-m" test.go
# command-line-arguments
./test.go:12:12: inlining call to fmt.Printf
./test.go:6:10: new(struct {}) does not escape
./test.go:7:10: new(struct {}) does not escape
./test.go:10:10: new(struct {}) escapes to heap
./test.go:11:10: new(struct {}) escapes to heap
./test.go:12:35: c == d escapes to heap
./test.go:12:12: []interface {} literal does not escape
<autogenerated>:1: .this does not escape
0xc000074f47 0xc000074f47 false
&{} &{} true
println
와 사이의 차이 fmt.Printf
입니다.