Go: Printf() 和 Println() 区别 (转载)

本文详细介绍了Go语言中fmt包的Println与Printf函数的区别及其用法,特别是Printf的格式化输出规则,包括不同类型的数据如何格式化输出。

Println 与Printf 都是fmt 包中的公共方法,在需要打印信息时需要用到这二个函数,那么这二个函数有什么区别呢?

Println :可以打印出字符串,和变量
Printf : 只可以打印出格式化的字符串,可以输出字符串类型的变量,不可以输出整形变量和整形

也就是说,当需要格式化输出信息时一般选择 Printf,其他时候用 Println 就可以了,比如:

a := 10
fmt.Println(a)      //right
fmt.Println("abc")  //right
fmt.Printf("%d", a) //right
fmt.Printf(a)       //error

Printf 详细用法

Printf 在使用时需要给它指定一个格式化规则,即第一个参数,那么一共有多少种格式呢,用的时候需要怎么写呢?

package main

import (
	"fmt"
	"os"
)

type point struct {
	x, y int
}

func main() {
	//Go 为常规 Go 值的格式化设计提供了多种打印方式。例如,这里打印了 point 结构体的一个实例。
	p := point{1, 2}
	fmt.Printf("%v\n", p) // {1 2}
	//如果值是一个结构体,%+v 的格式化输出内容将包括结构体的字段名。
	fmt.Printf("%+v\n", p) // {x:1 y:2}
	//%#v 形式则输出这个值的 Go 语法表示。例如,值的运行源代码片段。
	fmt.Printf("%#v\n", p) // main.point{x:1, y:2}
	//需要打印值的类型,使用 %T。
	fmt.Printf("%T\n", p) // main.point
	//格式化布尔值是简单的。
	fmt.Printf("%t\n", true)
	//格式化整形数有多种方式,使用 %d进行标准的十进制格式化。
	fmt.Printf("%d\n", 123)
	//这个输出二进制表示形式。
	fmt.Printf("%b\n", 14)
	//这个输出给定整数的对应字符。
	fmt.Printf("%c\n", 33)
	//%x 提供十六进制编码。
	fmt.Printf("%x\n", 456)
	//对于浮点型同样有很多的格式化选项。使用 %f 进行最基本的十进制格式化。
	fmt.Printf("%f\n", 78.9)
	//%e 和 %E 将浮点型格式化为(稍微有一点不同的)科学技科学记数法表示形式。
	fmt.Printf("%e\n", 123400000.0)
	fmt.Printf("%E\n", 123400000.0)
	//使用 %s 进行基本的字符串输出。
	fmt.Printf("%s\n", "\"string\"")
	//像 Go 源代码中那样带有双引号的输出,使用 %q。
	fmt.Printf("%q\n", "\"string\"")
	//和上面的整形数一样,%x 输出使用 base-16 编码的字符串,每个字节使用 2 个字符表示。
	fmt.Printf("%x\n", "hex this")
	//要输出一个指针的值,使用 %p。
	fmt.Printf("%p\n", &p)
	//当输出数字的时候,你将经常想要控制输出结果的宽度和精度,可以使用在 % 后面使用数字来控制输出宽度。默认结果使用右对齐并且通过空格来填充空白部分。
	fmt.Printf("|%6d|%6d|\n", 12, 345)
	//你也可以指定浮点型的输出宽度,同时也可以通过 宽度.精度 的语法来指定输出的精度。
	fmt.Printf("|%6.2f|%6.2f|\n", 1.2, 3.45)
	//要最对齐,使用 - 标志。
	fmt.Printf("|%-6.2f|%-6.2f|\n", 1.2, 3.45)
	//你也许也想控制字符串输出时的宽度,特别是要确保他们在类表格输出时的对齐。这是基本的右对齐宽度表示。
	fmt.Printf("|%6s|%6s|\n", "foo", "b")
	//要左对齐,和数字一样,使用 - 标志。
	fmt.Printf("|%-6s|%-6s|\n", "foo", "b")
	//到目前为止,我们已经看过 Printf了,它通过 os.Stdout输出格式化的字符串。Sprintf 则格式化并返回一个字符串而不带任何输出。
	s := fmt.Sprintf("a %s", "string")
	fmt.Println(s)
	//你可以使用 Fprintf 来格式化并输出到 io.Writers而不是 os.Stdout。
	fmt.Fprintf(os.Stderr, "an %s\n", "error")
}

————————————————
版权声明:本文为优快云博主「zgh0711」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/zgh0711/article/details/78843361

<think>嗯,用户现在问的是Go语言中PrintfPrintln区别。我之前帮他解决过关于运行Go程序时的错误,可能他对Go的基础还不熟悉,现在开始学习输出函数了。首先,我需要回忆一下这两个函数的区别PrintfPrintln都是fmt包里的函数,但用途不同。Printf是格式化输出,需要格式字符串,后面跟着变量,比如Printf("%d", num)。而Println则是输出各个参数后自动加换行,参数之间用空格分开。比如Println("Hello", "world")会输出Hello world并换行。 用户可能刚接触Go,所以需要解释清楚两者的基本区别,最好用例子说明。另外,用户之前遇到的是环境配置问题,可能还在学习基础,所以需要避免用太专业的术语,保持简单明了。 还需要注意他们是否了解格式化动词,比如%d、%s这些,可能需要稍微解释一下。同时,提醒他们Println会自动添加空格换行,而Printf需要手动处理,比如用\n换行。有没有其他区别呢?比如返回值或者错误处理?不过这两个函数通常用于输出,可能不需要深入讨论错误处理。 有没有其他常见的使用场景?比如Printf适合需要精确控制输出格式的时候,而Println适合快速调试,输出多个变量。比如在打印多个变量值时,Println更方便,而需要特定格式如保留小数位数时用Printf。 是否需要给出示例代码?比如对比两者的输出结果,这样用户更直观。同时,提醒他们注意参数类型匹配,特别是在Printf中使用格式化动词时要确保类型正确,否则可能导致运行时错误。 总结一下,回答的结构应该是先指出它们都属于fmt包,然后分别解释各自的功能,对比它们的区别,比如参数处理、换行行为、使用场景,再给出示例,最后可能加上注意事项。这样用户能一步步理解两者的不同,避免混淆。</think>### Go语言中 `Printf` 与 `Println` 的区别Go 语言的 `fmt` 包中,`Printf` `Println` 都是用于控制台输出的函数,但它们的用途行为有显著差异: --- #### **1. 功能对比** | **特性** | **`Printf`** | **`Println`** | |-----------------|---------------------------------------|------------------------------------| | **核心功能** | **格式化输出** | **按默认格式输出并自动换行** | | **参数要求** | 第一个参数是格式字符串,后续为变量 | 直接接收任意类型参数,无需格式字符串 | | **换行行为** | 需手动添加 `\n` 换行符 | 自动在输出末尾添加换行符 | | **空格分隔** | 无自动分隔,需手动控制 | 参数间自动用空格分隔 | --- #### **2. 使用示例** ##### (1) 基础用法 ```go package main import "fmt" func main() { name := "Alice" age := 25 // Printf:需指定格式,不换行 fmt.Printf("Name: %s, Age: %d", name, age) // 输出:Name: Alice, Age: 25 // Println:自动换行,参数间空格分隔 fmt.Println("Name:", name, "Age:", age) // 输出:Name: Alice Age: 25\n } ``` ##### (2) 格式化控制对比 ```go // Printf 的格式化能力 fmt.Printf("Hex: 0x%x, Float: %.2f\n", 255, 3.1415) // Hex: 0xff, Float: 3.14 // Println 的简单输出 fmt.Println("Hex:", 0xff, "Float:", 3.1415) // Hex: 255 Float: 3.1415 ``` --- #### **3. 关键差异总结** | **场景** | **`Printf`** 适用场景 | **`Println`** 适用场景 | |------------------------|------------------------------------------|------------------------------------| | **复杂格式** | 需要精确控制输出格式(如对齐、小数位数) | 快速输出调试信息,无需复杂格式 | | **多参数输出** | 需手动处理分隔符换行 | 自动用空格分隔参数并换行 | | **性能敏感场景** | 直接操作字符串效率更高 | 因自动处理分隔符,性能略低 | --- #### **4. 注意事项** 1. **类型安全** - `Printf` 必须严格匹配格式符参数类型(如 `%d` 对应整数),否则会报错或输出意外结果。 - `Println` 对参数类型无要求,自动调用 `String()` 方法或默认格式输出。 2. **特殊符号处理** ```go // Printf 需要转义 % fmt.Printf("Discount: 50%%") // 输出:Discount: 50% // Println 无需转义 fmt.Println("Discount: 50%") // 输出:Discount: 50% ``` 3. **返回值差异** 两者均返回写入的字节数可能的错误(但通常忽略): ```go n, _ := fmt.Printf("Hello") // n = 5 m, _ := fmt.Println("Hello") // m = 6(包含换行符) ``` --- #### **5. 扩展对比** | **函数** | **等价代码** | |-----------------|------------------------------------------| | `Println(a, b)` | `Print(a); Print(" "); Print(b); Print("\n")` | | `Printf("%v %v\n", a, b)` | 与 `Println(a, b)` 效果类似 | --- ### **选择建议** - 需要**定制格式**(如表格对齐、进制转换) → **`Printf`** - 快速输出**调试信息**或**变量值** → **`Println`** - 混合使用时注意**换行控制**,避免输出粘连: ```go fmt.Printf("Progress: ") // 不换行 fmt.Println("50%") // 追加并换行 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值