Answers:
println
是内置函数(在运行时中),当fmt
程序包位于标准库中时,该函数最终可能会删除,该函数将继续存在。看到有关该主题的规范。
对于语言开发人员来说,println
没有依赖关系很方便,但是方法是使用fmt
软件包或类似的东西(log
例如)。
正如您在实现中看到的那样,这些print(ln)
功能并非旨在远程支持其他输出模式,而主要是调试工具。
以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.Stdout
,os.Stderr
或者甚至是一个net.Conn
类型。),并没有实现特定的。
负责输出的大多数软件包都具有fmt
依赖项,例如log
。如果您的程序要在生产中输出任何内容,fmt
则很可能是您想要的软件包。
我可以在这里看到区别:
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
有趣的例子:
➜ 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
。