3.5.5.格式化字符串和切片
字符串可以以给定的最小宽度(如果字符串太短,就以空格填充)输出,也可以以给定的最大宽度(如果字符串太长将被截断)输出。字符串可以以Unicode编码(即字符)、码点序列(即rune)或UTF-8字节码的形式输出。
1 2 | slogan := "End Óréttlæti♥" fmt.Printf("%s\n%q\n%+q\n%#q\n", slogan, slogan, slogan, slogan) |
1 2 3 4 | End Óréttlæti♥ "End Óréttlæti♥" "End \u00d3r\u00e9ttl\u00e6ti\u2665" `End Óréttlæti♥` |
%s格式化动作用于打印字符串;%q(引号引起来的字符串)格式化动作用于将Go语言的双引号引起来的可打印的字符打印出来,并使用转义形式输出其它字符(参见表3.1)。如果使用了“+”修饰符,则只打印ASCII字符(从U+0020到U+007E),而其他字符则使用转义符的形式输出。如果使用了“#”修饰符,则会尽可能的输出Go语言的原始字符串,否则输出以双引号引起来的字符串。
虽然通常情况下,与一个格式化动作相对应的变量是一个兼容类型的单一值(例如%d和%x对应于int类型),该变量也可以是一个切片或一个键与值(如都是字符串或都是数字)都和给定的格式化动作兼容的映射。
1 2 | chars := []rune(slogan) fmt.Printf("%x\n%#x\n%#X\n", chars, chars, chars) |
1 2 3 | [45·6e·64·20·d3·72·e9·74·74·6c·e6·74·69·2665] [0x45·0x6e·0x64·0x20·0xd3·0x72·0xe9·0x74·0x74·0x6c·0xe6·0x74·0x69·0x2665] [0X45·0X6E·0X64·0X20·0XD3·0X72·0XE9·0X74·0X74·0X6C·0XE6·0X74·0X69·0X2665] |
这里我们使用%x 和%X以十六进制数字(每个数字对应一个码点)序列的形式打印一个rune类型的切片,在本例中是一个码点切片。如果使用了#修饰符,则每个数字输出时都强制以0x 或0X开头。
对于大多数类型,其对应的切片会以方括号括起来并以空格分隔的形式输出。但其中一个例外是[]byte切片不会输出方括号和空格,除非我们使用了%v格式化动作。
1 2 | bytes := []byte(slogan) fmt.Printf("%s\n%x\n%X\n% X\n%v\n", bytes, bytes, bytes, bytes, bytes) |
1 2 3 4 5 | End·Óréttlæti♥ 456e6420c39372c3a974746cc3a67469e299a5 456E6420C39372C3A974746CC3A67469E299A5 45·6E·64·20·C3·93·72·C3·A9·74·74·6C·C3·A6·74·69·E2·99·A5 [69·110·100·32·195·147·114·195·169·116·116·108·195·166·116·105·226·153·165] |
一个字节切片,在这里是字符串的UTF-8字节表示,可以以两位十六进制数字序列的形式打印,其中每个数字表示一个字节。如果我们使用%s格式化动作,则字节切片会被认为是UTF-8编码的Unicode字节并以字符串的形式打印出来。[]bytes切片没有用于输出的可替代的十六进制格式,但这些数字可以像上面例子中输出的倒数第二行那样使用空格分隔。%v以方括号括起来的以空格分隔的十进制形式将[]byte切片输出。
Go语言默认是右对齐的;我们可以使用“-”修饰符来将输出左对齐。当然,我们可以像下面两个例子中那样指定输出的最小宽度和可以输出的最大字符数。
1 2 3 | s := "Dare to be naïve" fmt.Printf("|%22s|%-22s|%10s|\n", s, s, s) |······Dare·to·be·naïve|Dare·to·be·naïve······|Dare·to·be·naïve| |
在这个代码段中,第三个格式(%10s)指定了一个具有10个字符宽的最小宽度,但是因为字符串的长度比该宽度要长,所以字符串被完整打印出来。
1 2 3 | i := strings.Index(s, "n") fmt.Printf("|%.10s|%.*s|%-22.10s|%s|\n", s, i, s, s, s) |Dare·to·be|Dare·to·be·|Dare·to·be············|Dare·to·be·naïve| |
在这里,第一个格式(%.10s)指定了对于字符串最多可以输出10个字符,所以在这种情况下字符串以指定的宽度截断。第二个格式(%.*s)期望传入两个参数:最多要打印的字符个数和一个字符串;这里我们使用字符串中字符n的索引位置来作为最大值,这意味着所有位于该索引位置之前但不包括该索引位置的字符都会被打印出来。第三个格式(%-22.10s)同时指定了22个字符的最小宽度为和10个字符的最大可打印的字符个数,这意味着一个22个字符宽的字符串只有其前10个字符可以被打印出来。因为其宽度大于要打印的字符数,所以输出要以空格填充并使用“-”修饰符将其左对齐。