再看strings包

我们在第4章“复合类型的使用”中首先讨论了strings包。本节将讨论与文件输入和输出相关的strings包。

str.go第一部分代码如下:

  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. "os"
  6. "strings"
  7. )

str.go的第二段代码如下:

  1. func main() {
  2. r := strings.NewReader("test")
  3. fmt.Println("r length", r.Len())

strings.NewReader()函数从字符串创建只读Readerstrings.Reader对象实现了io.Readerio.ReaderAtio.Seekerio.WriterToio.ByteScannerio.RuneScanner接口。

str.go第三部分代码如下:

  1. b := make([]byte, 1)
  2. for {
  3. n, err := r.Read(b)
  4. if err == io.EOF {
  5. break
  6. }
  7. if err != nil {
  8. fmt.Println(err)
  9. continue
  10. }
  11. fmt.Printf("Read %s Bytes: %d\n", b, n)
  12. }

此处,你可以看到如何使用strings.Reader作为io.Reader接口,从而使用Read()函数逐字节读取字符串。

str.go的最后一段代码如下:

  1. s := strings.NewReader("This is an error!\n")
  2. fmt.Println("r length:", s.Len())
  3. n, err := s.WriteTo(os.Stderr)
  4. if err != nil {
  5. fmt.Println(err)
  6. return
  7. }
  8. fmt.Printf("Wrote %d bytes to os.Stderr\n", n)
  9. }

在这段代码中,你可以看到如何在strings包的帮助下编写标准错误。

  1. $ go run str.go
  2. r length 4
  3. Read t Bytes: 1
  4. Read e Bytes: 1
  5. Read s Bytes: 1
  6. Read t Bytes: 1
  7. r length: 18
  8. This is an error!
  9. Wrote 18 bytes to os.Stderr
  10. $ go run str.go 2>/dev/null
  11. r length 4
  12. Read t Bytes: 1
  13. Read e Bytes: 1
  14. Read s Bytes: 1
  15. Read t Bytes: 1
  16. r length: 18
  17. Wrote 18 bytes to os.Stderr