为了账号安全,请及时绑定邮箱和手机立即绑定

具有 fmt 的意外 EOF。扫描器

具有 fmt 的意外 EOF。扫描器

Go
慕妹3242003 2022-09-05 09:17:01
如果我想扫描字符串,我可以这样做:package mainimport (   "fmt"   "strings")func main() {   r := strings.NewReader("west north east")   for {      var s string      _, e := fmt.Fscan(r, &s)      fmt.Printf("%q %v\n", s, e)      if e != nil { break }   }}结果:"west" <nil>"north" <nil>"east" <nil>"" EOF我最近发现了[1],所以我想我会尝试实现它。我想出了这个:fmt.Scannerpackage mainimport (   "fmt"   "strings")type comma struct { tok string }func (c *comma) Scan(state fmt.ScanState, verb rune) error {   tok, err := state.Token(false, func(r rune) bool {      return r != ','   })   if err != nil {      return err   }   if _, _, err := state.ReadRune(); err != nil {      if len(tok) == 0 {         return err      }   }   c.tok = string(tok)   return nil}func main() {   r := strings.NewReader("west,north,east")   for {      var c comma      _, e := fmt.Fscan(r, &c)      fmt.Printf("%q %v\n", c.tok, e)      if e != nil { break }   }}结果:"west" <nil>"north" <nil>"east" <nil>"" unexpected EOF因此,结果非常接近,但是困扰我的是.有没有可能只是得到一个常规与一个自定义?我在这里做错了什么,还是这是一个错误?unexpected EOFEOFfmt.Scannerhttps://golang.org/pkg/fmt#Scanner
查看完整描述

1 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

多亏了名单上的伊恩·兰斯·泰勒(Ian Lance Taylor),他建议使用错误而不是.在 Go 代码中,调用一个函数,该函数又调用一个函数 [1]。最后一个函数用于将任何错误转换为常规错误。该程序为我的原始示例提供了可识别的输出:golang-nutspanicreturnFscandoScanerrorHandlerrecoverpanic


package main


import (

   "fmt"

   "strings"

)


type comma struct { tok string }


func (c *comma) Scan(state fmt.ScanState, verb rune) error {

   tok, err := state.Token(false, func(r rune) bool {

      return r != ','

   })

   if err != nil { return err }

   if _, _, err := state.ReadRune(); err != nil {

      if len(tok) == 0 {

         panic(err)

      }

   }

   c.tok = string(tok)

   return nil

}


func main() {

   r := strings.NewReader("west,north,east")

   for {

      var c comma

      _, err := fmt.Fscan(r, &c)

      fmt.Printf("%q %v\n", c.tok, err)

      if err != nil { break }

   }

}

https://github.com/golang/go/blob/go1.16.4/src/fmt/scan.go#L1056-L1067


查看完整回答
反对 回复 2022-09-05
  • 1 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号