Go语言中println和fmt.Println区别

 更新时间:2023年07月04日 15:09:49   作者:PigeonEssence  
本文主要介绍了Go语言中println和fmt.Println区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

作为一个刚刚接触Go的萌新,在学习Go语言的时候发现demo用了两种用法输出语句:

package main
import "fmt"
func main() {
   const LENGTH int = 10
   const WIDTH int = 5  
   var area int
   const a, b, c = 1, false, "str" //多重赋值
   area = LENGTH * WIDTH
   fmt.Printf("面积为 : %d", area)
   println()
   println(a, b, c)  
}

其中运用了println()和fmt包中的Printf()函数用于输出,然后我又想起,再fmt函数中,还有一个相似的函数是

fmt.Println

于是我就研究了一下println()和fmt.Println()的区别与用法:

println()函数:

我们点进函数可以清楚地看到注释:

// The println built-in function formats its arguments in an
// implementation-specific way and writes the result to standard error.
// Spaces are always added between arguments and a newline is appended.
// Println is useful for bootstrapping and debugging; it is not guaranteed
// to stay in the language.
func println(args ...Type)

简单翻译一下:

1.The println built-in function formats its arguments in an implementation-specific way and writes the result to standard error.
   println内置函数以特定于实现的方式格式化其参数,并将结果写入标准错误。
2.Spaces are always added between arguments and a newline is appended.
   始终在参数之间添加空格,并追加换行符。
3.Println is useful for bootstrapping and debugging; it is not guaranteed to stay in the language.
   Println用于引导和调试;但是不保证在未来的Go版本中继续存在

fmt.println()函数:        

// Println formats using the default formats for its operands and writes to standard output.
// Spaces are always added between operands and a newline is appended.
// It returns the number of bytes written and any write error encountered.
func Println(a ...interface{}) (n int, err error) {
	return Fprintln(os.Stdout, a...)
}

简单翻译一下:

1.Println formats using the default formats for its operands and writes to standard output.
   Println格式使用其操作数的默认格式,并写入标准输出。
2.Spaces are always added between operands and a newline is appended.
   始终在操作数之间添加空格,并追加换行符。
3.It returns the number of bytes written and any write error encountered.
   它返回写入的字节数和遇到的任何写入错误。

根据官方注释,我们可以很清楚的看到在注释中他们很大的区别是在于,fmt.println()是在fmt包下的方法,将结果写入标准输出,而println是在builtin包下的方法,将结果写入标准错误。

总结区别:

1.包不同:

fmt包:fmt 包使用函数实现 I/O 格式化(类似于 C 的 printf 和 scanf 的函数), 格式化参数源自C,但更简单。

builtin包:builtin包是go的预声明定义,包括go语言中常用的各种类型和方法声明,包括变量和常量两部分.其详细声明在builtin.go文件中。

因为builtin包是预申明的包,所以不需要import就可以使用,而 fmt 包需要提前import。

2.输出方式不同:

输入标准输出和标准错误也是很明显的输出体现,使用菜鸟教程const iota的例子说明:

//iota
	const (
		a = iota   //0
		b          //1
		c          //2
		d = "ha"   //独立值,iota += 1
		e          //"ha"   iota += 1
		f = 100    //iota +=1
		g          //100  iota +=1
		h = iota   //7,恢复计数
		i          //8
	)
	fmt.Println(a,b,c,d,e,f,g,h,i)
	println(a,b,c,d,e,f,g,h,i)

输出:

很明显可以看出,在Windows Goland IDE下:标准输出是白色,错误输出是红色。所以一般适用于debug的时候,并且不保证在未来的Go版本中继续存在。一般输出还是调用fmt包输出更为妥当。

3.方法返回值不同:

我们首先观察两个方法的代码:

package fmt
func Println(a ...interface{}) (n int, err error) {
	return Fprintln(os.Stdout, a...)
}
package builtin
func println(args ...Type)

可以发现,fmt.Println是有返回值参数的。

fmt.println():

  • 第一个返回值是:the number of bytes written,也就是往输出上写入了多少个字节
  • 第二个返回值是:any write error encountered,也就是写入的任何错误

也就是说fmt.println()可以实现println()中无法实现的字节数统计和错误分析。

4.内置print/println函数的调用不能接受数组和结构体参数

//定义数组
	arr := [5]int{1,2,3,4,5}
	fmt.Println(arr)

成功输出:

//定义数组
	arr := [5]int{1,2,3,4,5}
	println(arr)

输出错误:

 5.对于组合类型的参数,内置的print/println函数将输出参数的底层值部的地址,而fmtlog标准库包中的打印函数将输出接口参数的动态值的字面形式。

func main() {
	var numbers = make([]int,3,5)
	printSlice(numbers)
}
func printSlice(x []int){
	fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
	println("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

输出结果:

 6.如果一个实参有String() stringError() string方法,那么fmtlog标准库包里的打印函数在打印参数时会调用这两个方法,而内置的print/println函数则会忽略参数的这些方法。

func main() {
	conent, err := openFile()
	if err != nil {
		fmt.Printf("fmt.Printf:存在错误,%v\n", err)
	} else {
		fmt.Println(string(conent))
	}
	if err != nil {
		println("println:存在错误,%v\n",err)
	} else {
		println(string(conent))
	}
}
//只是模拟一个错误
func openFile() ([]byte, error) {
	return nil, &fileError{}
}
type fileError struct {
}
func (fe *fileError) Error() string {
	return "文件错误"
}

输出结果:

到此这篇关于Go语言中println和fmt.Println区别的文章就介绍到这了,更多相关Go语言 println fmt.Println内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言为什么不支持前缀自增运算符原理解析

    Go语言为什么不支持前缀自增运算符原理解析

    这篇文章主要为大家介绍了Go语言为什么不支持前缀自增运算符原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Go slice切片使用示例详解

    Go slice切片使用示例详解

    这篇文章主要为大家介绍了Go slice切片使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go设计模式之备忘录模式讲解和代码示例

    Go设计模式之备忘录模式讲解和代码示例

    备忘录是一种行为设计模式, 允许生成对象状态的快照并在以后将其还原,本文就通过代码示例给大家讲讲Go备忘录模式,感兴趣的小伙伴跟着小编一起来看看吧
    2023-08-08
  • 实时通信的服务器推送机制 EventSource(SSE) 简介附go实现示例代码

    实时通信的服务器推送机制 EventSource(SSE) 简介附go实现示例代码

    EventSource是一种非常有用的 API,适用于许多实时应用场景,它提供了一种简单而可靠的方式来建立服务器推送连接,并实现实时更新和通知,这篇文章主要介绍了实时通信的服务器推送机制 EventSource(SSE)简介附go实现示例,需要的朋友可以参考下
    2024-03-03
  • 详解Go语言运用广度优先搜索走迷宫

    详解Go语言运用广度优先搜索走迷宫

    广度优先搜索是从图中的某一顶点出发,遍历每一个顶点时,依次遍历其所有的邻接点,再从这些邻接点出发,依次访问它们的邻接点,直到图中所有被访问过的顶点的邻接点都被访问到。然后查看图中是否存在尚未被访问的顶点,若有,则以该顶点为起始点,重复上述遍历的过程
    2021-06-06
  • Go 语言数据结构之双链表学习教程

    Go 语言数据结构之双链表学习教程

    这篇文章主要为大家介绍了Go 语言数据结构之双链表学习教程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Go语言实现从PDF自动化提取条码的开发全流程解析

    Go语言实现从PDF自动化提取条码的开发全流程解析

    在实际的业务场景中,我们常常需要从 PDF 文件中提取条码信息,本文将通过 Go 语言开发一个自动扫描目录内所有 PDF 并提取条码的工具,感兴趣的小伙伴可以了解下
    2025-11-11
  • Golang操作Kafka的实现示例

    Golang操作Kafka的实现示例

    本文主要介绍了Golang操作Kafka的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Go语言连接Oracle数据库的方法

    Go语言连接Oracle数据库的方法

    这篇文章主要介绍了Go语言连接Oracle数据库的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Go 中的Map与字符处理指南

    Go 中的Map与字符处理指南

    在Go中,map可以存储字符,但需要理解字符在Go中的表示方式,本文给大家介绍Go中的Map与字符处理指南,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-06-06

最新评论