HarrySun

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

1. install go

 

2. configure sublime
http://blog.csdn.net/cyxcw1/article/details/10329481

 

3.io package

1) io.Reader

 1 // io.Reader 接口示例
 2 package main
 3 
 4 import (
 5     "fmt"
 6     "io"
 7     "os"
 8     "strings"
 9 )
10 
11 func main() {
12 FOREND:
13     for {
14         readerMenu()
15 
16         var ch string
17         fmt.Scanln(&ch)
18         var (
19             data []byte
20             err  error
21         )
22         switch strings.ToLower(ch) {
23         case "1":
24             fmt.Println("请输入不多于9个字符,以回车结束:")
25             data, err = ReadFrom(os.Stdin, 11)
26         case "2":
27             file, err := os.Open("D:/src/read.go")
28             if err != nil {
29                 fmt.Println("打开文件 read.go:", err)
30                 continue
31             }
32             data, err = ReadFrom(file, 9)
33             file.Close()
34         case "3":
35             data, err = ReadFrom(strings.NewReader("from string"), 12)
36         case "4":
37             fmt.Println("暂未实现!")
38         case "b":
39             fmt.Println("返回上级菜单!")
40             break FOREND
41         case "q":
42             fmt.Println("程序退出!")
43             os.Exit(0)
44         default:
45             fmt.Println("输入错误!")
46             continue
47         }
48 
49         if err != nil {
50             fmt.Println("数据读取失败,可以试试从其他输入源读取!")
51         } else {
52             fmt.Printf("读取到的数据是:%s\n", data)
53         }
54     }
55 }
56 
57 func ReadFrom(reader io.Reader, num int) ([]byte, error) {
58     p := make([]byte, num)
59     n, err := reader.Read(p)
60     if n > 0 {
61         return p[:n], nil
62     }
63     return p, err
64 }
65 
66 func readerMenu() {
67     fmt.Println("")
68     fmt.Println("*******从不同来源读取数据*********")
69     fmt.Println("*******请选择数据源,请输入:*********")
70     fmt.Println("1 表示 标准输入")
71     fmt.Println("2 表示 普通文件")
72     fmt.Println("3 表示 从字符串")
73     fmt.Println("4 表示 从网络")
74     fmt.Println("b 返回上级菜单")
75     fmt.Println("q 退出")
76     fmt.Println("***********************************")
77 }

 

interface:

C:\Go\src\pkg\io\io.go

 1 // Reader is the interface that wraps the basic Read method.
 2 //
 3 // Read reads up to len(p) bytes into p.  It returns the number of bytes
 4 // read (0 <= n <= len(p)) and any error encountered.  Even if Read
 5 // returns n < len(p), it may use all of p as scratch space during the call.
 6 // If some data is available but not len(p) bytes, Read conventionally
 7 // returns what is available instead of waiting for more.
 8 //
 9 // When Read encounters an error or end-of-file condition after
10 // successfully reading n > 0 bytes, it returns the number of
11 // bytes read.  It may return the (non-nil) error from the same call
12 // or return the error (and n == 0) from a subsequent call.
13 // An instance of this general case is that a Reader returning
14 // a non-zero number of bytes at the end of the input stream may
15 // return either err == EOF or err == nil.  The next Read should
16 // return 0, EOF regardless.
17 //
18 // Callers should always process the n > 0 bytes returned before
19 // considering the error err.  Doing so correctly handles I/O errors
20 // that happen after reading some bytes and also both of the
21 // allowed EOF behaviors.
22 //
23 // Implementations of Read are discouraged from returning a
24 // zero byte count with a nil error, and callers should treat
25 // that situation as a no-op.
26 type Reader interface {
27     Read(p []byte) (n int, err error)
28 }

 

implements:

C:\Go\src\pkg\os\file.go

1 // Stdin, Stdout, and Stderr are open Files pointing to the standard input,
2 // standard output, and standard error file descriptors.
3 var (
4     Stdin  = NewFile(uintptr(syscall.Stdin), "/dev/stdin")
5     Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")
6     Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr")
7 )
 1 // Read reads up to len(b) bytes from the File.
 2 // It returns the number of bytes read and an error, if any.
 3 // EOF is signaled by a zero count with err set to io.EOF.
 4 func (f *File) Read(b []byte) (n int, err error) {
 5     if f == nil {
 6         return 0, ErrInvalid
 7     }
 8     n, e := f.read(b)
 9     if n < 0 {
10         n = 0
11     }
12     if n == 0 && len(b) > 0 && e == nil {
13         return 0, io.EOF
14     }
15     if e != nil {
16         err = &PathError{"read", f.name, e}
17     }
18     return n, err
19 }

 

C:\Go\src\pkg\strings\reader.go

package strings

import (
    "errors"
    "io"
    "unicode/utf8"
)

// A Reader implements the io.Reader, io.ReaderAt, io.Seeker, io.WriterTo,
// io.ByteScanner, and io.RuneScanner interfaces by reading
// from a string.
type Reader struct {
    s        string
    i        int // current reading index
    prevRune int // index of previous rune; or < 0
}


func (r *Reader) Read(b []byte) (n int, err error) {
    if len(b) == 0 {
        return 0, nil
    }
    if r.i >= len(r.s) {
        return 0, io.EOF
    }
    n = copy(b, r.s[r.i:])
    r.i += n
    r.prevRune = -1
    return
}

 

2) io.Writer

interface

 C:\Go\src\pkg\io\io.go

1 // Writer is the interface that wraps the basic Write method.
2 //
3 // Write writes len(p) bytes from p to the underlying data stream.
4 // It returns the number of bytes written from p (0 <= n <= len(p))
5 // and any error encountered that caused the write to stop early.
6 // Write must return a non-nil error if it returns n < len(p).
7 type Writer interface {
8     Write(p []byte) (n int, err error)
9 }

 

implements

C:\Go\src\pkg\os\file.go

 1 // Write writes len(b) bytes to the File.
 2 // It returns the number of bytes written and an error, if any.
 3 // Write returns a non-nil error when n != len(b).
 4 func (f *File) Write(b []byte) (n int, err error) {
 5     if f == nil {
 6         return 0, ErrInvalid
 7     }
 8     n, e := f.write(b)
 9     if n < 0 {
10         n = 0
11     }
12 
13     epipecheck(f, e)
14 
15     if e != nil {
16         err = &PathError{"write", f.name, e}
17     }
18     return n, err
19 }

 

 3) test

 1 package main
 2 
 3 import (
 4     "fmt"
 5     "io"
 6     "os"
 7 )
 8 
 9 func main() {
10     inFile, err := os.Open("d:/src/read.go")
11     if err != nil {
12         fmt.Println("can't open file d:/src/read.go")
13         os.Exit(1)               //???????
14     }
15     defer inFile.Close()
16 
17     outFile, err := os.Create("d:/src/output.txt")
18     if err != nil {
19         fmt.Println("can't create file d:/src/output.txt")
20         os.Exit(1)
21     }
22     defer outFile.Close()
23 
24     for {
25         buf := make([]byte, 20)
26         n, err := inFile.Read(buf)
27         if n == 0 && err == io.EOF {     //???????
28             fmt.Println("Done")
29             return
30         }
31         if err != nil {
32             fmt.Println("error occurs during reading")
33             os.Exit(2)
34         }
35 
36         _, err = outFile.Write(buf[:n])   //????????
37         if err != nil {
38             fmt.Println("error occurs during writing")
39             os.Exit(3)
40         }
41     }
42 
43 }

 

 

4. package os,log,  encoding/json

 
 1 // Unmarshal parses the JSON-encoded data and stores the result
 2 // in the value pointed to by v.
 3 //
 4 // Unmarshal uses the inverse of the encodings that
 5 // Marshal uses, allocating maps, slices, and pointers as necessary,
 6 // with the following additional rules:
 7 //
 8 // To unmarshal JSON into a pointer, Unmarshal first handles the case of
 9 // the JSON being the JSON literal null.  In that case, Unmarshal sets
10 // the pointer to nil.  Otherwise, Unmarshal unmarshals the JSON into
11 // the value pointed at by the pointer.  If the pointer is nil, Unmarshal
12 // allocates a new value for it to point to.
13 //
14 // To unmarshal JSON into a struct, Unmarshal matches incoming object
15 // keys to the keys used by Marshal (either the struct field name or its tag),
16 // preferring an exact match but also accepting a case-insensitive match.
17 //
18 // To unmarshal JSON into an interface value,
19 // Unmarshal stores one of these in the interface value:
20 //
21 //    bool, for JSON booleans
22 //    float64, for JSON numbers
23 //    string, for JSON strings
24 //    []interface{}, for JSON arrays
25 //    map[string]interface{}, for JSON objects
26 //    nil for JSON null
27 //
28 // If a JSON value is not appropriate for a given target type,
29 // or if a JSON number overflows the target type, Unmarshal
30 // skips that field and completes the unmarshalling as best it can.
31 // If no more serious errors are encountered, Unmarshal returns
32 // an UnmarshalTypeError describing the earliest such error.
33 //
34 // When unmarshaling quoted strings, invalid UTF-8 or
35 // invalid UTF-16 surrogate pairs are not treated as an error.
36 // Instead, they are replaced by the Unicode replacement
37 // character U+FFFD.
38 //
39 func Unmarshal(data []byte, v interface{}) error {
40     // Check for well-formedness.
41     // Avoids filling out half a data structure
42     // before discovering a JSON syntax error.
43     var d decodeState
44     err := checkValid(data, &d.scan)
45     if err != nil {
46         return err
47     }
48 
49     d.init(data)
50     return d.unmarshal(v)
51 }
52 
53 // Unmarshaler is the interface implemented by objects
54 // that can unmarshal a JSON description of themselves.
55 // The input can be assumed to be a valid encoding of
56 // a JSON value. UnmarshalJSON must copy the JSON data
57 // if it wishes to retain the data after returning.
58 type Unmarshaler interface {
59     UnmarshalJSON([]byte) error
60 }

 

 

 

 

posted on 2014-02-15 02:39  HarrySun  阅读(412)  评论(0编辑  收藏  举报