在go中,如果我们想要打印一些东西,我们可以这样做:
import "fmt"
func main(){
fmt.Println("Hello world!")
}
Run Code Online (Sandbox Code Playgroud)
但是我发现没有导入就可以做同样的事情fmt
:
func main(){
println("Hello world!")
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下吗?
Ale*_*uer 103
以nemo的答案为基础:
println
是一种内置于语言中的函数.它位于规范的Bootstrapping部分.从链接:
当前实现提供了几个在引导期间有用的内置函数.记录这些函数是为了完整性,但不保证保留在语言中.他们不会返回结果.
Run Code Online (Sandbox Code Playgroud)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
则很可能是您想要的包.
我可以在这里看到不同之处:
rangeOverIntsAndStrings(1, 5)
func rangeOverIntsAndStrings(args ...interface{}) {
for _, v := range args {
println(v)
}
}
Run Code Online (Sandbox Code Playgroud)
// 输出
(0x108f060,0x10c5358)
(0x108f060,0x10c5360)
Run Code Online (Sandbox Code Playgroud)
对比
func rangeOverIntsAndStrings(args ...interface{}) {
for _, v := range args {
fmt.Println(v)
}
}
Run Code Online (Sandbox Code Playgroud)
// 输出
1
5
Run Code Online (Sandbox Code Playgroud)