golang實作類別似Scan或者Scanf功能

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

fmt.Scan或者fmt.Scanf可以從標準輸入中讀取資料,也可以自己實現一個類似的功能

package mainimport (        _"errors"        "fmt"        "io"        "os"        "syscall"        "time"        "bytes"        _"os/exec"        "github.com/docker/docker/pkg/term")func main() {   Stdin()}func Stdin() {        var in io.Reader        in = os.NewFile(uintptr(syscall.Stdin), "/dev/stdin")        _,ok:= term.GetFdInfo(in)        if ok {                fmt.Println("Is terminal \n")        }        reader := bytes.NewBuffer(make([]byte, 10))        for {                data, _:= reader.ReadFrom(in) //很奇怪為什麼一直阻塞在這裡                fmt.Printf("read from stdin %v \n", data)                time.Sleep(2 * time.Second)        }}

阻塞在ReadFrom那裡,可以看看ReadFrom的具體實現

func (b *Buffer) ReadFrom(r io.Reader) (n int64, err error) {b.lastRead = opInvalid// If buffer is empty, reset to recover space.if b.off >= len(b.buf) {b.Truncate(0)}//因為沒有讀到標準輸出的EOF,所以一直在讀for {if free := cap(b.buf) - len(b.buf); free < MinRead {// not enough space at endnewBuf := b.bufif b.off+free < MinRead {// not enough space using beginning of buffer;// double buffer capacitynewBuf = makeSlice(2*cap(b.buf) + MinRead)}copy(newBuf, b.buf[b.off:])b.buf = newBuf[:len(b.buf)-b.off]b.off = 0}m, e := r.Read(b.buf[len(b.buf):cap(b.buf)])b.buf = b.buf[0 : len(b.buf)+m]n += int64(m)if e == io.EOF {break}if e != nil {return n, e}}return n, nil // err is EOF, so return nil explicitly}

標準輸入裝置(stdin)怎麼輸入EOF??

    列印出EOF這個宏 , 值為-1。

    但是如果直接輸入 -1 ,系統會認為這是兩個字元 - 和 1。

    其實輸入CRTL+D可以算EOF


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.