加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang实现类似Scan或者Scanf功能

发布时间:2020-12-16 19:21:38 所属栏目:大数据 来源:网络整理
导读:fmt.Scan或者fmt.Scanf可以从标准输入中读取数据,也可以自己实现一个类似的功能 packagemainimport(_"errors""fmt""io""os""syscall""time""bytes"_"os/exec""github.com/docker/docker/pkg/term")funcmain(){Stdin()}funcStdin(){varinio.Readerin=os.NewF

fmt.Scan或者fmt.Scanf可以从标准输入中读取数据,也可以自己实现一个类似的功能

packagemain

import(
_"errors"
"fmt"
"io"
"os"
"syscall"
"time"
"bytes"
_"os/exec"
"github.com/docker/docker/pkg/term"
)

funcmain(){
Stdin()
}

funcStdin(){
varinio.Reader


in=os.NewFile(uintptr(syscall.Stdin),"/dev/stdin")

_,ok:=term.GetFdInfo(in)

ifok{
fmt.Println("Isterminaln")
}

reader:=bytes.NewBuffer(make([]byte,10))

for{
data,_:=reader.ReadFrom(in)//很奇怪为什么一直阻塞在这里
fmt.Printf("readfromstdin%vn",data)
time.Sleep(2*time.Second)
}

}

阻塞在ReadFrom那里,可以看看ReadFrom的具体实现

func(b*Buffer)ReadFrom(rio.Reader)(nint64,errerror){
	b.lastRead=opInvalid
	//Ifbufferisempty,resettorecoverspace.
	ifb.off>=len(b.buf){
		b.Truncate(0)
	}
	//因为没有读到标准输出的EOF,所以一直在读
	for{
		iffree:=cap(b.buf)-len(b.buf);free<MinRead{
			//notenoughspaceatend
			newBuf:=b.buf
			ifb.off+free<MinRead{
				//notenoughspaceusingbeginningofbuffer;
				//doublebuffercapacity
				newBuf=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)
		ife==io.EOF{
			break
		}
		ife!=nil{
			returnn,e
		}
	}
	returnn,nil//erriSEOF,soreturnnilexplicitly
}

标准输入设备(stdin)怎么输入EOF??

打印出EOF这个宏,值为-1。

但是如果直接输入 -1,系统会认为这是两个字符 - 和 1。

其实输入CRTL+D可以算EOF

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读