Go语⾔基础--Printf格式化输出、Scanf格式化输⼊详解
⼏种输出⽅式的区别
Print、Println 、Printf、Sprintf 、Fprintf都是fmt 包中的公共⽅法,在需要打印信息时需要⽤到这些函数,那么这些函数有什么区别呢?
Print:  输出到控制台(不接受任何格式化,它等价于对每⼀个操作数都应⽤ %v)
fmt.Print(str)
Println: 输出到控制台并换⾏
fmt.Println(tmp)
Printf : 只可以打印出格式化的字符串。只可以直接输出字符串类型的变量(不可以输出整形变量和整形等)
fmt.Printf("%d",a)
Sprintf:格式化并返回⼀个字符串⽽不带任何输出。
s := fmt.Sprintf("a %s", "string") fmt.Printf(s)
Fprintf:来格式化并输出到 io.Writers ⽽不是 os.Stdout。
fmt.Fprintf(os.Stderr, “an %s\n”, “error”)
Printf 格式化输出
通⽤占位符:
v    值的默认格式。
%+v  添加字段名(如结构体)
%#v 相应值的Go语法表⽰
%T    相应值的类型的Go语法表⽰
%%    字⾯上的百分号,并⾮值的占位符 
布尔值:
%t  true 或 false
整数值:
%b    ⼆进制表⽰
%c    相应Unicode码点所表⽰的字符
%d    ⼗进制表⽰
%o    ⼋进制表⽰
%q    单引号围绕的字符字⾯值,由Go语法安全地转义
%x    ⼗六进制表⽰,字母形式为⼩写 a-f
%X    ⼗六进制表⽰,字母形式为⼤写 A-F
%U    Unicode格式:U+1234,等同于 "U+%04X"
浮点数及复数:
%b    ⽆⼩数部分的,指数为⼆的幂的科学计数法,与 strconv.FormatFloat中的 'b' 转换格式⼀致。例如 -123456p-78
%e    科学计数法,例如 -1234.456e+78
%E    科学计数法,例如 -1234.456E+78
%f    有⼩数点⽽⽆指数,例如 123.456
%g    根据情况选择 %e 或 %f 以产⽣更紧凑的(⽆末尾的0)输出
%G    根据情况选择 %E 或 %f 以产⽣更紧凑的(⽆末尾的0)输出
字符串和bytes的slice表⽰:
%s    字符串或切⽚的⽆解译字节
%q    双引号围绕的字符串,由Go语法安全地转义
%x    ⼗六进制,⼩写字母,每字节两个字符
%X    ⼗六进制,⼤写字母,每字节两个字符
指针:
%p    ⼗六进制表⽰,前缀 0x
这⾥没有 'u' 标记。若整数为⽆符号类型,他们就会被打印成⽆符号的。类似地,这⾥也不需要指定操作数的⼤⼩(int8,int64)。
对于%v来说默认的格式是:
bool:                    %t
int, int8 etc.:          %d
uint, uint8 etc.:        %d, %x if printed with %#v
float32, complex64, etc: %g
string:                  %s
chan:                    %p
pointer:                %p
由此可以看出,默认的输出格式可以使⽤%v进⾏指定,除⾮输出其他与默认不同的格式,否则都可以使⽤%v进⾏替代(但是不推荐使⽤)对于复合对象:
⾥⾯的元素使⽤如下规则进⾏打印:
struct:            {field0 field1 ...}
array, slice:      [elem0 elem1 ...]
maps:              map[key1:value1 key2:value2]
pointer to above:  &{}, &[], &map[]
宽度和精度:
宽度是在%之后的值,如果没有指定,则使⽤该值的默认值,精度是跟在宽度之后的值,如果没有指定,也是使⽤要打印的值的默认精度.例如:%9.2f,宽度9,精度2
%f:      default width, default precision
%9f      width 9, default precision
%.2f    default width, precision 2
%9.2f    width 9, precision 2
%9.f    width 9, precision 0
对数值⽽⾔,宽度为该数值占⽤区域的最⼩宽度;精度为⼩数点之后的位数。但对于 %g/%G ⽽⾔,精度为所有数字的总数。例如,对于123.45,格式 %6.2f会打印123.45,⽽ %.4g 会打印123.5。%e 和 %f 的默认精度为6;但对于 %g ⽽⾔,它的默认精度为确定该值所必须的最⼩位数。
对⼤多数值⽽⾔,宽度为输出的最⼩字符数,如果必要的话会为已格式化的形式填充空格。对字符串⽽⾔,精度为输出的最⼤字符数,如果必要的话会直接截断。
宽度是指"必要的最⼩宽度". 若结果字符串的宽度超过指定宽度时, 指定宽度就会失效。
若将宽度指定为`*'时, 将从参数中取得宽度值。
紧跟在"."后⾯的数串表⽰精度(若只有"."的话,则为".0")。若遇到整数的指⽰符(`d', `i', `b', `o', `x', `X', `u')的话,精度表⽰数值部分的长
若遇到浮点数的指⽰符(`f')的话,它表⽰⼩数部分的位数。
若遇到浮点数的指⽰符(`e', `E', `g', `G')的话,它表⽰有效位数
若将精度设为`*'的话,将从参数中提取精度的值
其中对于字符串%s或者浮点类型%f,来说,精度可以截断数据的长度.如下所⽰.
func main() {
a := 123
fmt.Printf("%1.2d\n", a)    //123,宽度为1⼩于数值本⾝宽度,失效,⽽精度为2,⽆法截断整数
b := 1.23
fmt.Printf("%1.1f\n", b)    //1.2,精度为1,截断浮点型数据
c := "asdf"
fprintf格式fmt.Printf("%*.*s\n", 1, 2, c) //as,利⽤'*'⽀持宽度和精度的输⼊,并且字符串也可以利⽤精度截断
}
其他标志:
+    总打印数值的正负号;对于%q(%+q)保证只输出ASCII编码的字符。
-    左对齐
#    备⽤格式:为⼋进制添加前导 0(%#o),为⼗六进制添加前导 0x(%#x)或0X(%#X),为 %p(%#p)去掉前导 0x;对于 %q,若 strconv.CanBackquote 返' '  (空格)为数值中省略的正负号留出空⽩(% d);以⼗六进制(% x, % X)打印字符串或切⽚时,在字节之间⽤空格隔开
0    填充前导的0⽽⾮空格;对于数字,这会将填充移到正负号之后
对于每⼀个 Printf 类的函数,都有⼀个 Print 函数,该函数不接受任何格式化,它等价于对每⼀个操作数都应⽤ %v。另⼀个变参函数
Println 会在操作数之间插⼊空⽩,并在末尾追加⼀个换⾏符
不考虑占位符的话,如果操作数是接⼝值,就会使⽤其内部的具体值,⽽⾮接⼝本⾝。如下所⽰:
package main
import (
"fmt"
)
type Sample struct {
a  int
str string
}
func main() {
var i interface{} = Sample{1, "a"}
fmt.Printf("%v\n", i)      //{1 a}
}
显⽰参数占位符:
go中⽀持显⽰参数占位符,通过在输出格式中指定其输出的顺序即可,如下所⽰:
func main() {
fmt.Printf("%[2]d, %[1]d\n", 11, 22)  //22, 11,先输出第⼆个值,再输出第⼀个值
}
格式化错误:
如果给占位符提供了⽆效的实参(如将⼀个字符串提供给%d),便会出现格式化错误.所有的错误都始于“%!”,有时紧跟着单个字符(占位符),并以⼩括号括住的描述结尾。
func main() {
var i int = 1
fmt.Printf("%s\n", i)  //%!s(int=1)
}
输出实例
package main
import "fmt"
import "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")
}
⼏种输⼊⽅式的区别

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。