回答:
ネモの答えを基にするには:
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
は、たいていのパッケージが必要です。
興味深い例:
➜ 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
。