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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |