喝酒过敏 發表於 2019-9-15 12:54:00

Go语言fmt.Printf使用指南

<h1 class="post-title">Go语言fmt.Printf使用指南</h1>
<p>&nbsp;</p>
<div class="post-content">
<p>fmt标准库是我们在学习Go语言过程中接触最早最频繁的一个了,本文介绍了fmtb包的一些常用函数。</p>
<h1 id="autoid-0-0-0">fmt</h1>
<p>fmt包实现了类似C语言printf和scanf的格式化I/O。主要分为向外输出内容和获取输入内容两大部分。</p>
<h2 id="autoid-1-0-0">向外输出</h2>
<p>标准库<code>fmt</code>提供了以下几种输出相关函数。</p>
<h3 id="autoid-1-1-0">Print</h3>
<p><code>Print</code>系列函数会将内容输出到系统的标准输出,区别在于<code>Print</code>函数直接输出内容,<code>Printf</code>函数支持格式化输出字符串,<code>Println</code>函数会在输出内容的结尾添加一个换行符。</p>
<pre class="line-numbers language-go"><code class=" language-go"><span class="token keyword keyword-func">func</span> <span class="token function">Print</span><span class="token punctuation">(</span>a <span class="token operator">...</span><span class="token keyword keyword-interface">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">(</span>n <span class="token builtin">int</span><span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">)</span>
<span class="token keyword keyword-func">func</span> <span class="token function">Printf</span><span class="token punctuation">(</span>format <span class="token builtin">string</span><span class="token punctuation">,</span> a <span class="token operator">...</span><span class="token keyword keyword-interface">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">(</span>n <span class="token builtin">int</span><span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">)</span>
<span class="token keyword keyword-func">func</span> <span class="token function">Println</span><span class="token punctuation">(</span>a <span class="token operator">...</span><span class="token keyword keyword-interface">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">(</span>n <span class="token builtin">int</span><span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">)</span>
</code></pre>
<p>举个简单的例子:</p>
<pre class="line-numbers language-go"><code class=" language-go"><span class="token keyword keyword-func">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        fmt<span class="token punctuation">.</span><span class="token function">Print</span><span class="token punctuation">(</span><span class="token string">"在终端打印该信息。"</span><span class="token punctuation">)</span>
        name <span class="token operator">:=</span> <span class="token string">"沙河小王子"</span>
        fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"我是:%s\n"</span><span class="token punctuation">,</span> name<span class="token punctuation">)</span>
        fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"在终端打印单独一行显示"</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre>
<p>执行上面的代码输出:</p>
<pre class="line-numbers language-go"><code class=" language-go">在终端打印该信息。我是:沙河小王子
在终端打印单独一行显示
</code></pre>
<h3 id="autoid-1-1-1">Fprint</h3>
<p><code>Fprint</code>系列函数会将内容输出到一个<code>io.Writer</code>接口类型的变量<code>w</code>中,我们通常用这个函数往文件中写入内容。</p>
<pre class="line-numbers language-go"><code class=" language-go"><span class="token keyword keyword-func">func</span> <span class="token function">Fprint</span><span class="token punctuation">(</span>w io<span class="token punctuation">.</span>Writer<span class="token punctuation">,</span> a <span class="token operator">...</span><span class="token keyword keyword-interface">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">(</span>n <span class="token builtin">int</span><span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">)</span>
<span class="token keyword keyword-func">func</span> <span class="token function">Fprintf</span><span class="token punctuation">(</span>w io<span class="token punctuation">.</span>Writer<span class="token punctuation">,</span> format <span class="token builtin">string</span><span class="token punctuation">,</span> a <span class="token operator">...</span><span class="token keyword keyword-interface">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">(</span>n <span class="token builtin">int</span><span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">)</span>
<span class="token keyword keyword-func">func</span> <span class="token function">Fprintln</span><span class="token punctuation">(</span>w io<span class="token punctuation">.</span>Writer<span class="token punctuation">,</span> a <span class="token operator">...</span><span class="token keyword keyword-interface">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">(</span>n <span class="token builtin">int</span><span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">)</span>
</code></pre>
<p>举个例子:</p>
<pre class="line-numbers language-go"><code class=" language-go"><span class="token comment">// 向标准输出写入内容</span>
fmt<span class="token punctuation">.</span><span class="token function">Fprintln</span><span class="token punctuation">(</span>os<span class="token punctuation">.</span>Stdout<span class="token punctuation">,</span> <span class="token string">"向标准输出写入内容"</span><span class="token punctuation">)</span>
fileObj<span class="token punctuation">,</span> err <span class="token operator">:=</span> os<span class="token punctuation">.</span><span class="token function">OpenFile</span><span class="token punctuation">(</span><span class="token string">"./xx.txt"</span><span class="token punctuation">,</span> os<span class="token punctuation">.</span>O_CREATE<span class="token operator">|</span>os<span class="token punctuation">.</span>O_WRONLY<span class="token operator">|</span>os<span class="token punctuation">.</span>O_APPEND<span class="token punctuation">,</span> <span class="token number">0644</span><span class="token punctuation">)</span>
<span class="token keyword keyword-if">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span>
        fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"打开文件出错,err:"</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span>
        <span class="token keyword keyword-return">return</span>
<span class="token punctuation">}</span>
name <span class="token operator">:=</span> <span class="token string">"沙河小王子"</span>
<span class="token comment">// 向打开的文件句柄中写入内容</span>
fmt<span class="token punctuation">.</span><span class="token function">Fprintf</span><span class="token punctuation">(</span>fileObj<span class="token punctuation">,</span> <span class="token string">"往文件中写如信息:%s"</span><span class="token punctuation">,</span> name<span class="token punctuation">)</span>
</code></pre>
<p>注意,只要满足<code>io.Writer</code>接口的类型都支持写入。</p>
<h3 id="autoid-1-1-2">Sprint</h3>
<p><code>Sprint</code>系列函数会把传入的数据生成并返回一个字符串。</p>
<pre class="line-numbers language-go"><code class=" language-go"><span class="token keyword keyword-func">func</span> <span class="token function">Sprint</span><span class="token punctuation">(</span>a <span class="token operator">...</span><span class="token keyword keyword-interface">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token builtin">string</span>
<span class="token keyword keyword-func">func</span> <span class="token function">Sprintf</span><span class="token punctuation">(</span>format <span class="token builtin">string</span><span class="token punctuation">,</span> a <span class="token operator">...</span><span class="token keyword keyword-interface">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token builtin">string</span>
<span class="token keyword keyword-func">func</span> <span class="token function">Sprintln</span><span class="token punctuation">(</span>a <span class="token operator">...</span><span class="token keyword keyword-interface">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token builtin">string</span>
</code></pre>
<p>简单的示例代码如下:</p>
<pre class="line-numbers language-go"><code class=" language-go">s1 <span class="token operator">:=</span> fmt<span class="token punctuation">.</span><span class="token function">Sprint</span><span class="token punctuation">(</span><span class="token string">"沙河小王子"</span><span class="token punctuation">)</span>
name <span class="token operator">:=</span> <span class="token string">"沙河小王子"</span>
age <span class="token operator">:=</span> <span class="token number">18</span>
s2 <span class="token operator">:=</span> fmt<span class="token punctuation">.</span><span class="token function">Sprintf</span><span class="token punctuation">(</span><span class="token string">"name:%s,age:%d"</span><span class="token punctuation">,</span> name<span class="token punctuation">,</span> age<span class="token punctuation">)</span>
s3 <span class="token operator">:=</span> fmt<span class="token punctuation">.</span><span class="token function">Sprintln</span><span class="token punctuation">(</span><span class="token string">"沙河小王子"</span><span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>s1<span class="token punctuation">,</span> s2<span class="token punctuation">,</span> s3<span class="token punctuation">)</span>
</code></pre>
<h3 id="autoid-1-1-3">Errorf</h3>
<p><code>Errorf</code>函数根据format参数生成格式化字符串并返回一个包含该字符串的错误。</p>
<pre class="line-numbers language-go"><code class=" language-go"><span class="token keyword keyword-func">func</span> <span class="token function">Errorf</span><span class="token punctuation">(</span>format <span class="token builtin">string</span><span class="token punctuation">,</span> a <span class="token operator">...</span><span class="token keyword keyword-interface">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token builtin">error</span>
</code></pre>
<p>通常使用这种方式来自定义错误类型,例如:</p>
<pre class="line-numbers language-go"><code class=" language-go">err <span class="token operator">:=</span> fmt<span class="token punctuation">.</span><span class="token function">Errorf</span><span class="token punctuation">(</span><span class="token string">"这是一个错误"</span><span class="token punctuation">)</span>
</code></pre>
<h2 id="autoid-1-1-4">格式化占位符</h2>
<p><code>*printf</code>系列函数都支持format格式化参数,在这里我们按照占位符将被替换的变量类型划分,方便查询和记忆。</p>
<h3 id="autoid-1-2-0">通用占位符</h3>
<table>
<thead>
<tr><th>占位符</th><th>说明</th></tr>
</thead>
<tbody>
<tr>
<td>%v</td>
<td>值的默认格式表示</td>
</tr>
<tr>
<td>%+v</td>
<td>类似%v,但输出结构体时会添加字段名</td>
</tr>
<tr>
<td>%#v</td>
<td>值的Go语法表示</td>
</tr>
<tr>
<td>%T</td>
<td>打印值的类型</td>
</tr>
<tr>
<td>%%</td>
<td>百分号</td>
</tr>
</tbody>
</table>
<p>示例代码如下:</p>
<pre class="line-numbers language-go"><code class=" language-go">fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%v\n"</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%v\n"</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span>
o <span class="token operator">:=</span> <span class="token keyword keyword-struct">struct</span><span class="token punctuation">{</span> name <span class="token builtin">string</span> <span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token string">"小王子"</span><span class="token punctuation">}</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%v\n"</span><span class="token punctuation">,</span> o<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%#v\n"</span><span class="token punctuation">,</span> o<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%T\n"</span><span class="token punctuation">,</span> o<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"100%%\n"</span><span class="token punctuation">)</span>
</code></pre>
<p>输出结果如下:</p>
<pre class="line-numbers language-bash"><code class=" language-bash">100
<span class="token boolean">false</span>
<span class="token punctuation">{</span>小王子<span class="token punctuation">}</span>
struct <span class="token punctuation">{</span> name string <span class="token punctuation">}</span><span class="token punctuation">{</span>name:<span class="token string">"小王子"</span><span class="token punctuation">}</span>
struct <span class="token punctuation">{</span> name string <span class="token punctuation">}</span>
100%
</code></pre>
<h3 id="autoid-1-2-1">布尔型</h3>
<table>
<thead>
<tr><th>占位符</th><th>说明</th></tr>
</thead>
<tbody>
<tr>
<td>%t</td>
<td>true或false</td>
</tr>
</tbody>
</table>
<h3 id="autoid-1-2-2">整型</h3>
<table>
<thead>
<tr><th>占位符</th><th>说明</th></tr>
</thead>
<tbody>
<tr>
<td>%b</td>
<td>表示为二进制</td>
</tr>
<tr>
<td>%c</td>
<td>该值对应的unicode码值</td>
</tr>
<tr>
<td>%d</td>
<td>表示为十进制</td>
</tr>
<tr>
<td>%o</td>
<td>表示为八进制</td>
</tr>
<tr>
<td>%x</td>
<td>表示为十六进制,使用a-f</td>
</tr>
<tr>
<td>%X</td>
<td>表示为十六进制,使用A-F</td>
</tr>
<tr>
<td>%U</td>
<td>表示为Unicode格式:U+1234,等价于”U+%04X”</td>
</tr>
<tr>
<td>%q</td>
<td>该值对应的单引号括起来的go语法字符字面值,必要时会采用安全的转义表示</td>
</tr>
</tbody>
</table>
<p>示例代码如下:</p>
<pre class="line-numbers language-go"><code class=" language-go">n <span class="token operator">:=</span> <span class="token number">65</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%b\n"</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%c\n"</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%d\n"</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%o\n"</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%x\n"</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%X\n"</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span>
</code></pre>
<p>输出结果如下:</p>
<pre class="line-numbers language-bash"><code class=" language-bash">1000001
A
65
101
41
41
</code></pre>
<h3 id="autoid-1-2-3">浮点数与复数</h3>
<table>
<thead>
<tr><th>占位符</th><th>说明</th></tr>
</thead>
<tbody>
<tr>
<td>%b</td>
<td>无小数部分、二进制指数的科学计数法,如-123456p-78</td>
</tr>
<tr>
<td>%e</td>
<td>科学计数法,如-1234.456e+78</td>
</tr>
<tr>
<td>%E</td>
<td>科学计数法,如-1234.456E+78</td>
</tr>
<tr>
<td>%f</td>
<td>有小数部分但无指数部分,如123.456</td>
</tr>
<tr>
<td>%F</td>
<td>等价于%f</td>
</tr>
<tr>
<td>%g</td>
<td>根据实际情况采用%e或%f格式(以获得更简洁、准确的输出)</td>
</tr>
<tr>
<td>%G</td>
<td>根据实际情况采用%E或%F格式(以获得更简洁、准确的输出)</td>
</tr>
</tbody>
</table>
<p>示例代码如下:</p>
<pre class="line-numbers language-go"><code class=" language-go">f <span class="token operator">:=</span> <span class="token number">12.34</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%b\n"</span><span class="token punctuation">,</span> f<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%e\n"</span><span class="token punctuation">,</span> f<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%E\n"</span><span class="token punctuation">,</span> f<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%f\n"</span><span class="token punctuation">,</span> f<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%g\n"</span><span class="token punctuation">,</span> f<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%G\n"</span><span class="token punctuation">,</span> f<span class="token punctuation">)</span>
</code></pre>
<p>输出结果如下:</p>
<pre class="line-numbers language-bash"><code class=" language-bash">6946802425218990p-49
1.234000e+01
1.234000E+01
12.340000
12.34
12.34
</code></pre>
<h3 id="autoid-1-2-4">字符串和[]byte</h3>
<table>
<thead>
<tr><th>占位符</th><th>说明</th></tr>
</thead>
<tbody>
<tr>
<td>%s</td>
<td>直接输出字符串或者[]byte</td>
</tr>
<tr>
<td>%q</td>
<td>该值对应的双引号括起来的go语法字符串字面值,必要时会采用安全的转义表示</td>
</tr>
<tr>
<td>%x</td>
<td>每个字节用两字符十六进制数表示(使用a-f</td>
</tr>
<tr>
<td>%X</td>
<td>每个字节用两字符十六进制数表示(使用A-F)</td>
</tr>
</tbody>
</table>
<p>示例代码如下:</p>
<pre class="line-numbers language-go"><code class=" language-go">s <span class="token operator">:=</span> <span class="token string">"小王子"</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%s\n"</span><span class="token punctuation">,</span> s<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%q\n"</span><span class="token punctuation">,</span> s<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%x\n"</span><span class="token punctuation">,</span> s<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%X\n"</span><span class="token punctuation">,</span> s<span class="token punctuation">)</span>
</code></pre>
<p>输出结果如下:</p>
<pre class="line-numbers language-bash"><code class=" language-bash">小王子
<span class="token string">"小王子"</span>
e5b08fe78e8be5ad90
E5B08FE78E8BE5AD90
</code></pre>
<h3 id="autoid-1-2-5">指针</h3>
<table>
<thead>
<tr><th>占位符</th><th>说明</th></tr>
</thead>
<tbody>
<tr>
<td>%p</td>
<td>表示为十六进制,并加上前导的0x</td>
</tr>
</tbody>
</table>
<p>示例代码如下:</p>
<pre class="line-numbers language-go"><code class=" language-go">a <span class="token operator">:=</span> <span class="token number">10</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%p\n"</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>a<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%#p\n"</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>a<span class="token punctuation">)</span>
</code></pre>
<p>输出结果如下:</p>
<pre class="line-numbers language-bash"><code class=" language-bash">0xc000094000
c000094000
</code></pre>
<h3 id="autoid-1-2-6">宽度标识符</h3>
<p>宽度通过一个紧跟在百分号后面的十进制数指定,如果未指定宽度,则表示值时除必需之外不作填充。精度通过(可选的)宽度后跟点号后跟的十进制数指定。如果未指定精度,会使用默认精度;如果点号后没有跟数字,表示精度为0。举例如下:</p>
<table>
<thead>
<tr><th>占位符</th><th>说明</th></tr>
</thead>
<tbody>
<tr>
<td>%f</td>
<td>默认宽度,默认精度</td>
</tr>
<tr>
<td>%9f</td>
<td>宽度9,默认精度</td>
</tr>
<tr>
<td>%.2f</td>
<td>默认宽度,精度2</td>
</tr>
<tr>
<td>%9.2f</td>
<td>宽度9,精度2</td>
</tr>
<tr>
<td>%9.f</td>
<td>宽度9,精度0</td>
</tr>
</tbody>
</table>
<p>示例代码如下:</p>
<pre class="line-numbers language-go"><code class=" language-go">n <span class="token operator">:=</span> <span class="token number">12.34</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%f\n"</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%9f\n"</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%.2f\n"</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%9.2f\n"</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%9.f\n"</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span>
</code></pre>
<p>输出结果如下:</p>
<pre class="line-numbers language-bash"><code class=" language-bash">12.340000
12.340000
12.34
    12.34
       12
</code></pre>
<h3 id="autoid-1-2-7">其他falg</h3>
<table>
<thead>
<tr><th>占位符</th><th>说明</th></tr>
</thead>
<tbody>
<tr>
<td>’+’</td>
<td>总是输出数值的正负号;对%q(%+q)会生成全部是ASCII字符的输出(通过转义);</td>
</tr>
<tr>
<td>’ ‘</td>
<td>对数值,正数前加空格而负数前加负号;对字符串采用%x或%X时(% x或% X)会给各打印的字节之间加空格</td>
</tr>
<tr>
<td>’-’</td>
<td>在输出右边填充空白而不是默认的左边(即从默认的右对齐切换为左对齐);</td>
</tr>
<tr>
<td>’#’</td>
<td>八进制数前加0(%#o),十六进制数前加0x(%#x)或0X(%#X),指针去掉前面的0x(%#p)对%q(%#q),对%U(%#U)会输出空格和单引号括起来的go字面值;</td>
</tr>
<tr>
<td>‘0’</td>
<td>使用0而不是空格填充,对于数值类型会把填充的0放在正负号后面;</td>
</tr>
</tbody>
</table>
<p>举个例子:</p>
<pre class="line-numbers language-go"><code class=" language-go">s <span class="token operator">:=</span> <span class="token string">"小王子"</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%s\n"</span><span class="token punctuation">,</span> s<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%5s\n"</span><span class="token punctuation">,</span> s<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%-5s\n"</span><span class="token punctuation">,</span> s<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%5.7s\n"</span><span class="token punctuation">,</span> s<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%-5.7s\n"</span><span class="token punctuation">,</span> s<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%5.2s\n"</span><span class="token punctuation">,</span> s<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%05s\n"</span><span class="token punctuation">,</span> s<span class="token punctuation">)</span>
</code></pre>
<p>输出结果如下:</p>
<pre class="line-numbers language-bash"><code class=" language-bash">小王子
小王子
小王子
小王子
小王子
   小王
00小王子
</code></pre>
<h2 id="autoid-1-2-8">获取输入</h2>
<p>Go语言<code>fmt</code>包下有<code>fmt.Scan</code>、<code>fmt.Scanf</code>、<code>fmt.Scanln</code>三个函数,可以在程序运行过程中从标准输入获取用户的输入。</p>
<h3 id="autoid-1-3-0">fmt.Scan</h3>
<p>函数定签名如下:</p>
<pre class="line-numbers language-go"><code class=" language-go"><span class="token keyword keyword-func">func</span> <span class="token function">Scan</span><span class="token punctuation">(</span>a <span class="token operator">...</span><span class="token keyword keyword-interface">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">(</span>n <span class="token builtin">int</span><span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">)</span>
</code></pre>
<ul>
<li>Scan从标准输入扫描文本,读取由空白符分隔的值保存到传递给本函数的参数中,换行符视为空白符。</li>
<li>本函数返回成功扫描的数据个数和遇到的任何错误。如果读取的数据个数比提供的参数少,会返回一个错误报告原因。</li>
</ul>
<p>具体代码示例如下:</p>
<pre class="line-numbers language-go"><code class=" language-go"><span class="token keyword keyword-func">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword keyword-var">var</span> <span class="token punctuation">(</span>
                name    <span class="token builtin">string</span>
                age   <span class="token builtin">int</span>
                married <span class="token builtin">bool</span>
        <span class="token punctuation">)</span>
        fmt<span class="token punctuation">.</span><span class="token function">Scan</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>name<span class="token punctuation">,</span> <span class="token operator">&amp;</span>age<span class="token punctuation">,</span> <span class="token operator">&amp;</span>married<span class="token punctuation">)</span>
        fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"扫描结果 name:%s age:%d married:%t \n"</span><span class="token punctuation">,</span> name<span class="token punctuation">,</span> age<span class="token punctuation">,</span> married<span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre>
<p>将上面的代码编译后在终端执行,在终端依次输入<code>小王子</code>、<code>28</code>和<code>false</code>使用空格分隔。</p>
<pre class="line-numbers language-bash"><code class=" language-bash">$ ./scan_demo
小王子 28 <span class="token boolean">false</span>
扫描结果 name:小王子 age:28 married:false
</code></pre>
<p><code>fmt.Scan</code>从标准输入中扫描用户输入的数据,将以空白符分隔的数据分别存入指定的参数。</p>
<h3 id="autoid-1-3-1">fmt.Scanf</h3>
<p>函数签名如下:</p>
<pre class="line-numbers language-go"><code class=" language-go"><span class="token keyword keyword-func">func</span> <span class="token function">Scanf</span><span class="token punctuation">(</span>format <span class="token builtin">string</span><span class="token punctuation">,</span> a <span class="token operator">...</span><span class="token keyword keyword-interface">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">(</span>n <span class="token builtin">int</span><span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">)</span>
</code></pre>
<ul>
<li>Scanf从标准输入扫描文本,根据format参数指定的格式去读取由空白符分隔的值保存到传递给本函数的参数中。</li>
<li>本函数返回成功扫描的数据个数和遇到的任何错误。</li>
</ul>
<p>代码示例如下:</p>
<pre class="line-numbers language-go"><code class=" language-go"><span class="token keyword keyword-func">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword keyword-var">var</span> <span class="token punctuation">(</span>
                name    <span class="token builtin">string</span>
                age   <span class="token builtin">int</span>
                married <span class="token builtin">bool</span>
        <span class="token punctuation">)</span>
        fmt<span class="token punctuation">.</span><span class="token function">Scanf</span><span class="token punctuation">(</span><span class="token string">"1:%s 2:%d 3:%t"</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>name<span class="token punctuation">,</span> <span class="token operator">&amp;</span>age<span class="token punctuation">,</span> <span class="token operator">&amp;</span>married<span class="token punctuation">)</span>
        fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"扫描结果 name:%s age:%d married:%t \n"</span><span class="token punctuation">,</span> name<span class="token punctuation">,</span> age<span class="token punctuation">,</span> married<span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre>
<p>将上面的代码编译后在终端执行,在终端按照指定的格式依次输入<code>小王子</code>、<code>28</code>和<code>false</code>。</p>
<pre class="line-numbers language-bash"><code class=" language-bash">$ ./scan_demo
1:小王子 2:28 3:false
扫描结果 name:小王子 age:28 married:false
</code></pre>
<p><code>fmt.Scanf</code>不同于<code>fmt.Scan</code>简单的以空格作为输入数据的分隔符,<code>fmt.Scanf</code>为输入数据指定了具体的输入内容格式,只有按照格式输入数据才会被扫描并存入对应变量。</p>
<p>例如,我们还是按照上个示例中以空格分隔的方式输入,<code>fmt.Scanf</code>就不能正确扫描到输入的数据。</p>
<pre class="line-numbers language-bash"><code class=" language-bash">$ ./scan_demo
小王子 28 <span class="token boolean">false</span>
扫描结果 name: age:0 married:false
</code></pre>
<h3 id="autoid-1-3-2">fmt.Scanln</h3>
<p>函数签名如下:</p>
<pre class="line-numbers language-go"><code class=" language-go"><span class="token keyword keyword-func">func</span> <span class="token function">Scanln</span><span class="token punctuation">(</span>a <span class="token operator">...</span><span class="token keyword keyword-interface">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">(</span>n <span class="token builtin">int</span><span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">)</span>
</code></pre>
<ul>
<li>Scanln类似Scan,它在遇到换行时才停止扫描。最后一个数据后面必须有换行或者到达结束位置。</li>
<li>本函数返回成功扫描的数据个数和遇到的任何错误。</li>
</ul>
<p>具体代码示例如下:</p>
<pre class="line-numbers language-go"><code class=" language-go"><span class="token keyword keyword-func">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword keyword-var">var</span> <span class="token punctuation">(</span>
                name    <span class="token builtin">string</span>
                age   <span class="token builtin">int</span>
                married <span class="token builtin">bool</span>
        <span class="token punctuation">)</span>
        fmt<span class="token punctuation">.</span><span class="token function">Scanln</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>name<span class="token punctuation">,</span> <span class="token operator">&amp;</span>age<span class="token punctuation">,</span> <span class="token operator">&amp;</span>married<span class="token punctuation">)</span>
        fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"扫描结果 name:%s age:%d married:%t \n"</span><span class="token punctuation">,</span> name<span class="token punctuation">,</span> age<span class="token punctuation">,</span> married<span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre>
<p>将上面的代码编译后在终端执行,在终端依次输入<code>小王子</code>、<code>28</code>和<code>false</code>使用空格分隔。</p>
<pre class="line-numbers language-bash"><code class=" language-bash">$ ./scan_demo
小王子 28 <span class="token boolean">false</span>
扫描结果 name:小王子 age:28 married:false
</code></pre>
<p><code>fmt.Scanln</code>遇到回车就结束扫描了,这个比较常用。</p>
<h3 id="autoid-1-3-3">bufio.NewReader</h3>
<p>有时候我们想完整获取输入的内容,而输入的内容可能包含空格,这种情况下可以使用<code>bufio</code>包来实现。示例代码如下:</p>
<pre class="line-numbers language-go"><code class=" language-go"><span class="token keyword keyword-func">func</span> <span class="token function">bufioDemo</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        reader <span class="token operator">:=</span> bufio<span class="token punctuation">.</span><span class="token function">NewReader</span><span class="token punctuation">(</span>os<span class="token punctuation">.</span>Stdin<span class="token punctuation">)</span> <span class="token comment">// 从标准输入生成读对象</span>
        fmt<span class="token punctuation">.</span><span class="token function">Print</span><span class="token punctuation">(</span><span class="token string">"请输入内容:"</span><span class="token punctuation">)</span>
        text<span class="token punctuation">,</span> <span class="token boolean">_</span> <span class="token operator">:=</span> reader<span class="token punctuation">.</span><span class="token function">ReadString</span><span class="token punctuation">(</span><span class="token string">'\n'</span><span class="token punctuation">)</span> <span class="token comment">// 读到换行</span>
        text <span class="token operator">=</span> strings<span class="token punctuation">.</span><span class="token function">TrimSpace</span><span class="token punctuation">(</span>text<span class="token punctuation">)</span>
        fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%#v\n"</span><span class="token punctuation">,</span> text<span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre>
<h3 id="autoid-1-3-4">Fscan系列</h3>
<p>这几个函数功能分别类似于<code>fmt.Scan</code>、<code>fmt.Scanf</code>、<code>fmt.Scanln</code>三个函数,只不过它们不是从标准输入中读取数据而是从<code>io.Reader</code>中读取数据。</p>
<pre class="line-numbers language-go"><code class=" language-go"><span class="token keyword keyword-func">func</span> <span class="token function">Fscan</span><span class="token punctuation">(</span>r io<span class="token punctuation">.</span>Reader<span class="token punctuation">,</span> a <span class="token operator">...</span><span class="token keyword keyword-interface">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">(</span>n <span class="token builtin">int</span><span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">)</span>
<span class="token keyword keyword-func">func</span> <span class="token function">Fscanln</span><span class="token punctuation">(</span>r io<span class="token punctuation">.</span>Reader<span class="token punctuation">,</span> a <span class="token operator">...</span><span class="token keyword keyword-interface">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">(</span>n <span class="token builtin">int</span><span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">)</span>
<span class="token keyword keyword-func">func</span> <span class="token function">Fscanf</span><span class="token punctuation">(</span>r io<span class="token punctuation">.</span>Reader<span class="token punctuation">,</span> format <span class="token builtin">string</span><span class="token punctuation">,</span> a <span class="token operator">...</span><span class="token keyword keyword-interface">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">(</span>n <span class="token builtin">int</span><span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">)</span>
</code></pre>
<h3 id="autoid-1-3-5">Sscan系列</h3>
<p>这几个函数功能分别类似于<code>fmt.Scan</code>、<code>fmt.Scanf</code>、<code>fmt.Scanln</code>三个函数,只不过它们不是从标准输入中读取数据而是从指定字符串中读取数据。</p>
<pre class="line-numbers language-go"><code class=" language-go"><span class="token keyword keyword-func">func</span> <span class="token function">Sscan</span><span class="token punctuation">(</span>str <span class="token builtin">string</span><span class="token punctuation">,</span> a <span class="token operator">...</span><span class="token keyword keyword-interface">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">(</span>n <span class="token builtin">int</span><span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">)</span>
<span class="token keyword keyword-func">func</span> <span class="token function">Sscanln</span><span class="token punctuation">(</span>str <span class="token builtin">string</span><span class="token punctuation">,</span> a <span class="token operator">...</span><span class="token keyword keyword-interface">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">(</span>n <span class="token builtin">int</span><span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">)</span>
<span class="token keyword keyword-func">func</span> <span class="token function">Sscanf</span><span class="token punctuation">(</span>str <span class="token builtin">string</span><span class="token punctuation">,</span> format <span class="token builtin">string</span><span class="token punctuation">,</span> a <span class="token operator">...</span><span class="token keyword keyword-interface">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">(</span>n <span class="token builtin">int</span><span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">)</span></code></pre>
</div><br><br>
来源:https://www.cnblogs.com/xiao-xue-di/p/11521823.html
頁: [1]
查看完整版本: Go语言fmt.Printf使用指南