Go中的fmt.Println()和println()之间的区别


116

如下图所示,无论是fmt.Println()println()给围棋相同的输出:Hello world!

但是:它们彼此之间有何不同?

片段1,使用fmt包装;

package main

import (
    "fmt"
)

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

片段2,不带fmt包装;

package main

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

Answers:


98

println是内置函数(在运行时中),当fmt程序包位于标准库中时,该函数最终可能会删除,该函数将继续存在。看到有关该主题的规范

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

正如您在实现中看到的那样,这些print(ln)功能并非旨在远程支持其他输出模式,而主要是调试工具。


108

以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

因此,它们对开发人员很有用,因为它们缺少依赖项(已内置到编译器中),但没有生产代码。同样重要的是要注意这一点,print并向println stderr不是向其报告stdout

fmt但是,由提供的系列是在生产代码中构建的。stdout除非另有说明,否则它们可预测地向汇报。他们更灵活(fmt.Fprint*可向任何报告io.Writer,例如os.Stdoutos.Stderr或者甚至是一个net.Conn类型。),并没有实现特定的。

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


3

我可以在这里看到区别:

rangeOverIntsAndStrings(1,5)

func rangeOverIntsAndStrings(args ...interface{}) {
    for _, v := range args {
        println(v)
    }
}

//输出

(0x108f060,0x10c5358)
(0x108f060,0x10c5360)

func rangeOverIntsAndStrings(args ...interface{}) {
    for _, v := range args {
        fmt.Println(v)
    }
}

//输出

1
5

1

至于区别,是一个例子。

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

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


11
我不明白你想说什么。
Pierrot '18

0

有趣的例子:

  netpoll git:(develop)  cat test.go
package main

import "fmt"

func main() {
        a := new(struct{})
        b := new(struct{})
        println(a, b, a == b)

        c := new(struct{})
        d := new(struct{})
        fmt.Printf("%v %v %v\n", c, d, c == d)
}
  netpoll git:(develop)  go run test.go       
0xc000074f47 0xc000074f47 false
&{} &{} true
  netpoll git:(develop)  go run -gcflags="-m" test.go
# command-line-arguments
./test.go:12:12: inlining call to fmt.Printf
./test.go:6:10: new(struct {}) does not escape
./test.go:7:10: new(struct {}) does not escape
./test.go:10:10: new(struct {}) escapes to heap
./test.go:11:10: new(struct {}) escapes to heap
./test.go:12:35: c == d escapes to heap
./test.go:12:12: []interface {} literal does not escape
<autogenerated>:1: .this does not escape
0xc000074f47 0xc000074f47 false
&{} &{} true

println和之间有一些区别fmt.Printf

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.