如下图所示,无论是fmt.Println()和println()给围棋相同的输出:Hello world!
fmt.Println()
println()
Hello world!
但是:它们之间有何不同?
Snippet 1,使用fmt包;
fmt
package main import ( "fmt" ) func main() { fmt.Println("Hello world!") }
Snippet 2,不带fmt包;
package main func main() { println("Hello world!") }
println是一个内置函数(进入运行时),最终可能会被删除,而fmt包在标准库中,它将持续存在。请参阅有关该主题的规范。
println
对于语言开发人员来说,println没有依赖项是很方便的,但要走的路是使用fmt包或类似的东西(log例如)。
log
正如您在实现中所看到的,这些print(ln)函数甚至不是为了远程支持不同的输出模式而设计的,主要是一个调试工具。
print(ln)
以 nemo 的回答为基础:
println是一种内置于语言中的函数。它位于规范的 Bootstrapping 部分。从链接:
当前的实现提供了几个在引导过程中有用的内置函数。这些函数被记录为完整性,但不保证保留在语言中。他们不返回结果。 ```none 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 ```
当前的实现提供了几个在引导过程中有用的内置函数。这些函数被记录为完整性,但不保证保留在语言中。他们不返回结果。
```none 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。
print
stderr
stdout
fmt但是,由 提供的系列是在生产代码中构建的。stdout除非另有说明,否则它们可预见地向 报告。它们更通用(fmt.Fprint*可以向任何io.Writer,例如os.Stdout,os.Stderr,甚至一个net.Conn类型报告。)并且不是特定于实现的。
fmt.Fprint*
io.Writer
os.Stdout
os.Stderr
net.Conn
大多数负责输出的包都具有fmt依赖项,例如log. 如果您的程序要在生产中输出任何内容,fmt则很可能是您想要的包。