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

Yul*_*ney 109 go println

在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部分.从链接:

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

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
Run Code Online (Sandbox Code Playgroud)

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

fmt但是,所提供的系列是按照生产代码构建的.stdout除非另有说明,否则他们可预测地报告.他们是更通用的(fmt.Fprint*可以到任何报告io.Writer,例如os.Stdout,os.Stderr或者甚至是一个net.Conn类型.),并没有实现特定的.

大多数负责输出的包都具有fmt依赖性,例如log.如果您的程序将在生产中输出任何内容,fmt则很可能是您想要的包.


nem*_*emo 86

println是一个内置函数(进入运行时),最终可能被删除,而fmt包在标准库中,它将持久存在.请参阅主题的规范.

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

正如您在实现中看到的,这些print(ln)功能甚至不能远程支持不同的输出模式,主要是调试工具.


R S*_*Sun 6

我可以在这里看到不同之处:

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)