2017-06-06 54 views
0

根據Scanner.scan documents,Scan()將掃描儀推進到下一個標記,但這是什麼意思?我發現Scanner.TextScanner.Bytes可以是不同的,這是令人費解的。Go的bufio.Scanner中的「掃描是否將掃描儀推進到下一個標記」是什麼意思?

此代碼並不總是會導致一個錯誤,但作爲文件變大,它的作用:

func TestScanner(t *testing.T) { 
    path := "/tmp/test.txt" 
    f, err := os.Open(path) 
    if err != nil { 
     panic(fmt.Sprint("failed to open ", path)) 
    } 
    defer f.Close() 
    scanner := bufio.NewScanner(f) 

    bs := make([][]byte, 0) 
    for scanner.Scan() { 
     bs = append(bs, scanner.Bytes()) 
    } 

    f, err = os.Open(path) 
    if err != nil { 
     panic(fmt.Sprint("failed to open ", path)) 
    } 
    defer f.Close() 
    scanner = bufio.NewScanner(f) 
    ss := make([]string, 0) 
    for scanner.Scan() { 
     ss = append(ss, scanner.Text()) 
    } 

    for i, b := range bs { 
     if string(b) != ss[i] { 
      t.Errorf("expect %s, got %s", ss[i], string(b)) 
     } 
    } 
} 

回答

3

令牌是由掃描儀的split function定義。 Scan()函數在分割函數發現令牌或出現錯誤時返回。

String()和Bytes()方法都返回當前標記。 String()方法returns a copy of the token。 Bytes()方法不分配內存和returns a slice,它們可能會使用在後續調用Scan()時覆蓋的後備數組。

Copy the slice從字節()返回,以避免此問題:

for scanner.Scan() { 
    bs = append(bs, append([]byte(nil), scanner.Bytes()...)) 
}