Go语言初见println和fmt.Println区别「建议收藏」

Go语言初见println和fmt.Println区别「建议收藏」目录println()函数:fmt.println()函数:总结区别:1.包不同:2.输出方式不同:3.方法返回值不同:4.内置print/println函数的调用不能接受数组和结构体参数。5.对于组合类型的参数,内置的print/println函数将输出参数的底层值部的地址,而fmt和log标准库包中的打印函数将输出接口参数的动态值的字面形式。6.如果一个实参有String()string或Error()string方法,那么fmt和log标准库包里的…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

 

目录

println()函数:

fmt.println()函数:

总结区别:

1.包不同:

2.输出方式不同:

3.方法返回值不同:

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

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

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


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

        原文是菜鸟教程中的DemoGo 语言常量 | 菜鸟教程

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)

输出:

       Go语言初见println和fmt.Println区别「建议收藏」

很明显可以看出,在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)

成功输出:

Go语言初见println和fmt.Println区别「建议收藏」

 

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

输出错误:

Go语言初见println和fmt.Println区别「建议收藏」 

 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)
}

输出结果:

Go语言初见println和fmt.Println区别「建议收藏」

 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区别「建议收藏」

 以上就是对于println和fmt.Println的区别总结,还有别的问题,欢迎补充

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/186726.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月2日 下午3:46
下一篇 2022年10月2日 下午4:00


相关推荐

  • docker连接宿主机mysql_docker搭建mysql主从

    docker连接宿主机mysql_docker搭建mysql主从相信我,看完这一篇,mysql主从复制能遇到的错误在我这里都遇到了,docker能遇到的错误在我这里也遇到了,包括centos的错误如果你还没有用docker搭建过mysql先不要急着搭建集群,可以显示着用docker搭建一个mysql,这里有教程,可以先试着去搭建一个mysql:之前我们使用docker搭建了一个Mysql,那既然一个Mysql我们可以搭建成功,集群还不是分分钟,今天我们就简单搭建一个Mysql集群,就搭建一个最简单的一主一从的主从复制吧,

    2022年8月13日
    7
  • Springboot源码_pe启动制作源码

    Springboot源码_pe启动制作源码我们在使用SpringBoot启动项目的时候,可能只需加一个注解,然后启动main,整个项目就运行了起来,但事实真的是所见即所得吗,还是SpringBoot在背后默默做了很多?本文会通过源码解析的方式深入理解SpringBoot启动全过程SpringBoot启动过程流程图源码解析大家不要抗拒源码解析,这个非常优秀的代码,我们如果能够学会对自己代码编写水平大有裨益首先,我们先来看下SpringBoot项目的启动类@SpringBootApplicationpublicclassSp.

    2022年8月21日
    7
  • tortoiseSVN汉化(简单飞机有汉化版吗)

    前言我们在进行项目的合作开发的时候一定无法离开一个公共平台,提供大家做项目的一个平台,目前使用较多的是SVN,它是一个开放源代码的版本控制系统。但是大家一定有遇到这样的问题,就是全英文界面(英语好的可以忽略),这个或多或少的让我们的工作效率降低了很多,特别是针对刚接触的小伙伴更是如此,本来就不熟悉,还全英文。下面我就来给大家一起来解决如何将全英文的SVN转化成中文版的SVN。处理前使用…

    2022年4月13日
    66
  • 腾讯大模型战略首次全景亮相:自研混元大模型、知识库、智能体、工具箱一应俱全

    腾讯大模型战略首次全景亮相:自研混元大模型、知识库、智能体、工具箱一应俱全

    2026年3月13日
    2
  • qq密码自动测试软件,QQ2004测试版密码获取演示「建议收藏」

    qq密码自动测试软件,QQ2004测试版密码获取演示「建议收藏」QQ2004测试版密码获取演示2004-6-219:142715QQ2004测试版密码获取演示2004-6-219:142715水平不高,请大家包涵最近快毕业了,比较忙。。。。如果补丁在你那里不好用,请给我反馈。QQ2004测试版密码获取演示作者:nbw[NE365]nboy.cnwlt.comwww.vxer.comQQ:343538175以前我做过盗取QQ2003密码的补丁。利用这种补…

    2022年7月20日
    22
  • uniapp中nvue与vue的区别

    uniapp中nvue与vue的区别uni app 是逻辑和渲染分离的 渲染层在 app 端提供了两套排版引擎 小程序方式的 webview 渲染 和 weex 方式的原生渲染 两种渲染引擎可以自己根据需要选 vue 文件走的 webview 渲染 nvue 走 weex 方式的原生渲染组件和 js 写法是一样的 css 不一样 原生排版的能用的 css 必须是 flex 布局 uni app 的 App 端内置了一个基于 weex 改进的原生渲染引擎 提供了原生渲染能力 在 App 端 如果使用 vue 页面 则使用 webview 渲染 如果使用 nvue 页面 nativevue 的缩写 则

    2026年3月20日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号