go中fmt.Println()和println()之间的区别是什么

问题描述 投票:96回答:3

在go中,如果我们想要打印一些东西,我们可以这样做:

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

但是我发现没有导入fmt就可以做同样的事情:

func main(){
    println("Hello world!")
}

有人可以解释一下吗?

go println
3个回答
82
投票

println是一个内置函数(进入运行时),最终可能被删除,而fmt包在标准库中,它将持续存在。有关该主题,请参阅the spec

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

正如你可以see in the implementationprint(ln)函数甚至不能远程支持不同的输出模式,主要是一个调试工具。


97
投票

以nemo的答案为基础:

println是一种内置于该语言中的功能。它位于spec的Bootstrapping部分。从链接:

当前实现提供了几个在引导期间有用的内置函数。记录这些函数是为了完整性,但不保证保留在该语言中。他们不会返回结果。

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

因此,它们对开发人员很有用,因为它们缺少依赖性(内置于编译器中),但不包含在生产代码中。值得注意的是,printprintlnstderr报告,而不是stdout

然而,由fmt提供的系列是按照生产代码构建的。除非另有说明,否则他们可以预见到stdout。它们更通用(fmt.Fprint*可以报告任何io.Writer,例如os.Stdoutos.Stderr,甚至net.Conn类型。)并且不是特定于实现的。

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


2
投票

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

println()打印指向功能测试地址的指针。

fmt.Println()打印功能的地址。

© www.soinside.com 2019 - 2024. All rights reserved.