아래 그림과 같이 모두 fmt.Println()
와 println()
이동에 동일한 출력을 제공합니다 :Hello world!
하지만 서로 어떻게 다른가요?
fmt
패키지를 사용하는 스 니펫 1 ;
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello world!")
}
fmt
패키지가 없는 스 니펫 2
package main
func main() {
println("Hello world!")
}
답변
println
최종적으로 제거 될 수있는 내장 함수 (런타임에 포함)이며 fmt
패키지는 지속될 표준 라이브러리에 있습니다. 해당 주제에 대한 사양 을 참조하십시오 .
언어 개발자의 경우 println
종속성 이 없는 것이 편리 하지만 fmt
패키지 또는 이와 유사한 것을 사용하는 것이 좋습니다 ( log
예 :).
구현 에서 볼 수 있듯이print(ln)
함수는 원격으로 다른 출력 모드를 지원하도록 설계되지 않았으며 주로 디버그 도구입니다.
답변
니모의 대답을 바탕으로 :
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
입니다.