If I want to scan through a string, I can do this:

~~~go
package main

import (
   "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 }
   }
}
~~~

Result:

~~~
"west" <nil>
"north" <nil>
"east" <nil>
"" EOF
~~~

I recently discovered `fmt.Scanner` [1], so I thought I would try to 
implement it. I came up with this:

~~~go
package main

import (
   "fmt"
   "strings"
)

type comma struct { tok string }

func (c *comma) Scan(s fmt.ScanState, r rune) error {
   tok, err := s.Token(false, func(r rune) bool {
      return r != ','
   })
   if err != nil {
      return err
   }
   c.tok = string(tok)
   if _, _, err := s.ReadRune(); err != nil {
      return err
   }
   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 }
   }
}
~~~

Result:

~~~
"west" <nil>
"north" <nil>
"east" unexpected EOF
~~~

So the result is pretty similar, but what bothers me is the `unexpected 
EOF`. It seems it is due to this code:

https://github.com/golang/go/blob/3075ffc93e962792ddf43b2a528ef19b1577ffb7/src/fmt/scan.go#L956-L966

It seems like `EOF` should be valid in this case, or perhaps I dont 
understand the reasoning for it to be unexpected.

1. https://golang.org/pkg/fmt#Scanner

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/6cc79b40-a666-4aca-8cec-fcb87df51fe1n%40googlegroups.com.

Reply via email to