在go中,如果我们想要打印一些东西,我们可以这样做:
import "fmt"
func main(){
fmt.Println("Hello world!")
}
但是我发现没有导入fmt
就可以做同样的事情:
func main(){
println("Hello world!")
}
有人可以解释一下吗?
println
是一个内置函数(进入运行时),最终可能被删除,而fmt
包在标准库中,它将持续存在。有关该主题,请参阅the spec。
对于语言开发人员来说,拥有一个没有依赖关系的println
是很方便的,但是要采用的方法是使用fmt
包或类似的东西(例如log
)。
正如你可以see in the implementation,print(ln)
函数甚至不能远程支持不同的输出模式,主要是一个调试工具。
以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
因此,它们对开发人员很有用,因为它们缺少依赖性(内置于编译器中),但不包含在生产代码中。值得注意的是,print
和println
向stderr
报告,而不是stdout
。
然而,由fmt
提供的系列是按照生产代码构建的。除非另有说明,否则他们可以预见到stdout
。它们更通用(fmt.Fprint*
可以报告任何io.Writer
,例如os.Stdout
,os.Stderr
,甚至net.Conn
类型。)并且不是特定于实现的。
大多数负责输出的软件包都将fmt
作为依赖项,例如log
。如果你的程序将在生产中输出任何东西,fmt
很可能是你想要的包。