黄仁勋 發表於 2019-5-19 10:06:00

Go语言标准库之fmt.Scan

<h1 class="post-title">Go语言fmt.Scan使用指南</h1>
<div class="post-content">
<p>本文介绍了Go语言中<code>fmt</code>包中从标准输入获取数据的的<code>Scan</code>系列函数、从<code>io.Reader</code>中获取数据的<code>Fscan</code>系列函数以及从字符串中获取数据的<code>Sscan</code>系列函数的用法。</p>
<h1 id="scan系列">Scan系列</h1>
<p>Go语言<code>fmt</code>包下有<code>fmt.Scan</code>、<code>fmt.Scanf</code>、<code>fmt.Scanln</code>三个函数,可以在程序运行过程中从标准输入获取用户的输入。</p>
<h2 id="fmt-scan">fmt.Scan</h2>
<h3 id="语法">语法</h3>
<div class="cnblogs_code">
<pre>func Scan(a ...<span style="color: rgba(0, 0, 255, 1)">interface</span>{}) (n <span style="color: rgba(0, 0, 255, 1)">int</span>, err error)</pre>
</div>
<ul>
<li>Scan从标准输入扫描文本,读取由空白符分隔的值保存到传递给本函数的参数中,换行符视为空白符。</li>
<li>本函数返回成功扫描的数据个数和遇到的任何错误。如果读取的数据个数比提供的参数少,会返回一个错误报告原因。</li>
</ul>
<h3 id="代码示例">代码示例</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">func main() {
    </span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> (
      name    </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">
      age   </span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)">
      married </span><span style="color: rgba(0, 0, 255, 1)">bool</span><span style="color: rgba(0, 0, 0, 1)">
    )
    fmt.Scan(</span>&amp;name, &amp;age, &amp;<span style="color: rgba(0, 0, 0, 1)">married)
    fmt.Printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">扫描结果 name:%s age:%d married:%t \n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, name, age, married)
}</span></pre>
</div>
<p>将上面的代码编译后在终端执行,在终端依次输入<code>小明</code>、<code>18</code>和<code>false</code>使用空格分隔。</p>
<div class="cnblogs_code">
<pre>$ ./<span style="color: rgba(0, 0, 0, 1)">scan_demo
小明 </span><span style="color: rgba(128, 0, 128, 1)">18</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
扫描结果 name:小明 age:</span><span style="color: rgba(128, 0, 128, 1)">18</span> married:<span style="color: rgba(0, 0, 255, 1)">false</span> </pre>
</div>
<p><code>fmt.Scan</code>从标准输入中扫描用户输入的数据,将以空白符分隔的数据分别存入指定的参数。</p>
<h2 id="fmt-scanf">fmt.Scanf</h2>
<h3 id="语法-1">语法</h3>
<div class="cnblogs_code">
<pre>func Scanf(format <span style="color: rgba(0, 0, 255, 1)">string</span>, a ...<span style="color: rgba(0, 0, 255, 1)">interface</span>{}) (n <span style="color: rgba(0, 0, 255, 1)">int</span>, err error)</pre>
</div>
<ul>
<li>Scanf从标准输入扫描文本,根据format参数指定的格式去读取由空白符分隔的值保存到传递给本函数的参数中。</li>
<li>本函数返回成功扫描的数据个数和遇到的任何错误。</li>
</ul>
<h3 id="代码示例-1">代码示例</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">func main() {
    </span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> (
      name    </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">
      age   </span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)">
      married </span><span style="color: rgba(0, 0, 255, 1)">bool</span><span style="color: rgba(0, 0, 0, 1)">
    )
    fmt.Scanf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1:%s 2:%d 3:%t</span><span style="color: rgba(128, 0, 0, 1)">"</span>, &amp;name, &amp;age, &amp;<span style="color: rgba(0, 0, 0, 1)">married)
    fmt.Printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">扫描结果 name:%s age:%d married:%t \n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, name, age, married)
}</span></pre>
</div>
<p>将上面的代码编译后在终端执行,在终端按照指定的格式依次输入小明、<code>18</code>和<code>false。</code></p>
<div class="cnblogs_code">
<pre>$ ./<span style="color: rgba(0, 0, 0, 1)">scan_demo
</span><span style="color: rgba(128, 0, 128, 1)">1</span>:小明 <span style="color: rgba(128, 0, 128, 1)">2</span>:<span style="color: rgba(128, 0, 128, 1)">18</span> <span style="color: rgba(128, 0, 128, 1)">3</span>:<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
扫描结果 name:小明 age:</span><span style="color: rgba(128, 0, 128, 1)">18</span> married:<span style="color: rgba(0, 0, 255, 1)">false</span> </pre>
</div>
<p><code>fmt.Scanf</code>不同于<code>fmt.Scan</code>简单的以空格作为输入数据的分隔符,<code>fmt.Scanf</code>为输入数据指定了具体的输入内容格式,只有按照格式输入数据才会被扫描并存入对应变量。</p>
<p>例如,我们还是按照上个示例中以空格分隔的方式输入,<code>fmt.Scanf</code>就不能正确扫描到输入的数据。</p>
<div class="cnblogs_code">
<pre>$ ./<span style="color: rgba(0, 0, 0, 1)">scan_demo
小明 </span><span style="color: rgba(128, 0, 128, 1)">18</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
扫描结果 name: age:</span><span style="color: rgba(128, 0, 128, 1)">0</span> married:<span style="color: rgba(0, 0, 255, 1)">false</span> </pre>
</div>
<h2>fmt.Scanln</h2>
<h3 id="语法-2">语法</h3>
<div class="cnblogs_code">
<pre>func Scanln(a ...<span style="color: rgba(0, 0, 255, 1)">interface</span>{}) (n <span style="color: rgba(0, 0, 255, 1)">int</span>, err error)</pre>
</div>
<ul>
<li>Scanln类似Scan,它在遇到换行时才停止扫描。最后一个数据后面必须有换行或者到达结束位置。</li>
<li>本函数返回成功扫描的数据个数和遇到的任何错误。</li>
</ul>
<h3 id="代码示例-2">代码示例</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">func main() {
    </span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> (
      name    </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">
      age   </span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)">
      married </span><span style="color: rgba(0, 0, 255, 1)">bool</span><span style="color: rgba(0, 0, 0, 1)">
    )
    fmt.Scanln(</span>&amp;name, &amp;age, &amp;<span style="color: rgba(0, 0, 0, 1)">married)
    fmt.Printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">扫描结果 name:%s age:%d married:%t \n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, name, age, married)
}</span></pre>
</div>
<p>将上面的代码编译后在终端执行,在终端依次输入<code>小明</code>、<code>18</code>和<code>false</code>使用空格分隔。</p>
<pre><code class="language-bash">$ ./scan_demo
小明 18 false
扫描结果 name:小明 age:18 married:false
</code></pre>
<p><code>fmt.Scanln</code>遇到回车就结束扫描了,这个比较常用。</p>
<h1 id="fscan系列">Fscan系列</h1>
<pre><code class="language-go">func Fscan(r io.Reader, a ...interface{}) (n int, err error)
func Fscanln(r io.Reader, a ...interface{}) (n int, err error)
func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)
</code></pre>
<p>这几个函数功能分别类似于<code>fmt.Scan</code>、<code>fmt.Scanf</code>、<code>fmt.Scanln</code>三个函数,只不过它们不是从标准输入中读取数据而是从<code>io.Reader</code>中读取数据。</p>
<h1 id="sscan系列">Sscan系列</h1>
<pre><code class="language-go">func Sscan(str string, a ...interface{}) (n int, err error)
func Sscanln(str string, a ...interface{}) (n int, err error)
func Sscanf(str string, format string, a ...interface{}) (n int, err error)
</code></pre>
<p>这几个函数功能分别类似于<code>fmt.Scan</code>、<code>fmt.Scanf</code>、<code>fmt.Scanln</code>三个函数,只不过它们不是从标准输入中读取数据而是从指定字符串中读取数据。</p>
</div><br><br>
来源:https://www.cnblogs.com/aaronthon/p/10883675.html
頁: [1]
查看完整版本: Go语言标准库之fmt.Scan