Go 中 fmt.Println()和 Println()的区别

如下所示,fmt.Println()println()在 Go: Hello world!中给出相同的输出

但是: 它们之间有什么不同呢?

代码段1,使用 fmt包;

package main


import (
"fmt"
)


func main() {
fmt.Println("Hello world!")
}

代码片段2,没有 fmt包;

package main


func main() {
println("Hello world!")
}
47055 次浏览

println是一个内置函数(在运行时中) ,最终可能会被删除,而 fmt包在标准库中,这将持久化。请参阅关于这个主题的 说明书

对于语言开发人员来说,拥有一个没有依赖关系的 println是很方便的,但是方法是使用 fmt包或类似的东西(例如 log)。

正如你可以 在实施中看到print(ln)功能的设计,甚至远程支持不同的输出模式,主要是一个调试工具。

基于 Nemo 的回答:

println是一个内置在语言中的函数。它位于 规格的 Bootstrating 部分。链接:

当前的实现提供了几个有用的内置函数 这些函数都有完整的文档说明 但不能保证在语言中保持不变。它们不返回 结果。

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

因此,它们对开发人员非常有用,因为它们缺乏依赖性(被构建到编译器中) ,但是在生产代码中不是这样。值得注意的是,printprintln 向 ABC2汇报,而不是向 stdout汇报

然而,fmt提供的系列是在生产代码中构建的。除非另有说明,否则它们向 stdout报告是可预测的。他们是更多才多艺(fmt.Fprint*可以报告任何 io.Writer,如 os.Stdoutos.Stderr,甚至一个 net.Conn类型。)并且不是特定于实现的。

大多数负责输出的包都将 fmt作为一个依赖项,例如 log。如果您的程序要在生产中输出任何东西,那么 fmt很可能就是您想要的软件包。

至于差异,这个就是一个例子。

println()打印一个指向函数测试地址的指针。

fmt.Println()打印函数的地址。

我可以从中看出不同:

RangeOverIntsAndString (1,5)

func rangeOverIntsAndStrings(args ...interface{}) {
for _, v := range args {
println(v)
}
}

//输出

(0x108f060,0x10c5358)
(0x108f060,0x10c5360)

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

这是 printlnfmt.Printf之间的一些差异。