|
|
@@ -26,45 +26,45 @@ import (
|
|
|
|
|
|
// A ParseError indicates an error in converting a word into an integer.
|
|
|
type ParseError struct {
|
|
|
- Index int // The index into the space-separated list of words.
|
|
|
- Word string // The word that generated the parse error.
|
|
|
- Err error // The raw error that precipitated this error, if any.
|
|
|
+ Index int // The index into the space-separated list of words.
|
|
|
+ Word string // The word that generated the parse error.
|
|
|
+ Err error // The raw error that precipitated this error, if any.
|
|
|
}
|
|
|
|
|
|
// String returns a human-readable error message.
|
|
|
func (e *ParseError) String() string {
|
|
|
- return fmt.Sprintf("pkg parse: error parsing %q as int", e.Word)
|
|
|
+ return fmt.Sprintf("pkg parse: error parsing %q as int", e.Word)
|
|
|
}
|
|
|
|
|
|
// Parse parses the space-separated words in in put as integers.
|
|
|
func Parse(input string) (numbers []int, err error) {
|
|
|
- defer func() {
|
|
|
- if r := recover(); r != nil {
|
|
|
- var ok bool
|
|
|
- err, ok = r.(error)
|
|
|
- if !ok {
|
|
|
- err = fmt.Errorf("pkg: %v", r)
|
|
|
- }
|
|
|
- }
|
|
|
- }()
|
|
|
-
|
|
|
- fields := strings.Fields(input)
|
|
|
- numbers = fields2numbers(fields)
|
|
|
- return
|
|
|
+ defer func() {
|
|
|
+ if r := recover(); r != nil {
|
|
|
+ var ok bool
|
|
|
+ err, ok = r.(error)
|
|
|
+ if !ok {
|
|
|
+ err = fmt.Errorf("pkg: %v", r)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ fields := strings.Fields(input)
|
|
|
+ numbers = fields2numbers(fields)
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
func fields2numbers(fields []string) (numbers []int) {
|
|
|
- if len(fields) == 0 {
|
|
|
- panic("no words to parse")
|
|
|
- }
|
|
|
- for idx, field := range fields {
|
|
|
- num, err := strconv.Atoi(field)
|
|
|
- if err != nil {
|
|
|
- panic(&ParseError{idx, field, err})
|
|
|
- }
|
|
|
- numbers = append(numbers, num)
|
|
|
+ if len(fields) == 0 {
|
|
|
+ panic("no words to parse")
|
|
|
+ }
|
|
|
+ for idx, field := range fields {
|
|
|
+ num, err := strconv.Atoi(field)
|
|
|
+ if err != nil {
|
|
|
+ panic(&ParseError{idx, field, err})
|
|
|
}
|
|
|
- return
|
|
|
+ numbers = append(numbers, num)
|
|
|
+ }
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
```
|
|
|
@@ -81,23 +81,23 @@ import (
|
|
|
)
|
|
|
|
|
|
func main() {
|
|
|
- var examples = []string{
|
|
|
- "1 2 3 4 5",
|
|
|
- "100 50 25 12.5 6.25",
|
|
|
- "2 + 2 = 4",
|
|
|
- "1st class",
|
|
|
- "",
|
|
|
- }
|
|
|
-
|
|
|
- for _, ex := range examples {
|
|
|
- fmt.Printf("Parsing %q:\n ", ex)
|
|
|
- nums, err := parse.Parse(ex)
|
|
|
- if err != nil {
|
|
|
- fmt.Println(err) // here String() method from ParseError is used
|
|
|
- continue
|
|
|
- }
|
|
|
- fmt.Println(nums)
|
|
|
+ var examples = []string{
|
|
|
+ "1 2 3 4 5",
|
|
|
+ "100 50 25 12.5 6.25",
|
|
|
+ "2 + 2 = 4",
|
|
|
+ "1st class",
|
|
|
+ "",
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, ex := range examples {
|
|
|
+ fmt.Printf("Parsing %q:\n ", ex)
|
|
|
+ nums, err := parse.Parse(ex)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println(err) // here String() method from ParseError is used
|
|
|
+ continue
|
|
|
}
|
|
|
+ fmt.Println(nums)
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
```
|
|
|
@@ -122,5 +122,5 @@ Parsing "":
|
|
|
## 链接
|
|
|
|
|
|
- [目录](directory.md)
|
|
|
-- 上一节:[从 panic 中恢复 (Recover)](13.3.md)
|
|
|
+- 上一节:[从 panic 中恢复(Recover)](13.3.md)
|
|
|
- 下一节:[一种用闭包处理错误的模式](13.5.md)
|