15. 标准库之bytes之Buffer
缓冲区具有读取和写入方法的可变大小的字节缓冲区。Buffer的零值是准备使用的空缓冲区。
(1).基本用法
声明一个Buffer的四种方法
var b bytes.Buffer //直接定义一个BUffer变量,不用初始化 b:=new(bytes.Buffer) //使用new返回Buffer b:=bytes.NweBuffer(s []byte) // 从一个[]byte切片,构造一个Buffer b:=bytes.NewBufferString(s string) //从一个string 构造一个Buffer
往Buffer中写入数据
b.Write(d []byte) // 姜切片写入Buffer尾部 b.WriteString(s string) // 将字符串s写入Buffr尾部 b.WriteByte(c byte) //将字符串c写入Buffer尾部 b.WriteRune(r rune) // 将一个rune类型的数据放到缓冲器的尾部 b.WriteTo(w io.Writer) //将Buffer中内容输出到实现了io.Writer接口的可写入对象中
(2).Buffer的定义和实现
package main import ( "bytes" "fmt" ) func main() { var b bytes.Buffer fmt.Printf("b: %v\n", b) // 第一个是切片 第二个是偏移量 第三个是读的位置 - {[] 0 0} b1 := bytes.NewBufferString("Hello world") // 返回的值字符串缓冲区 fmt.Printf("%v\n", b1) buffer := bytes.NewBuffer([]byte("你好 世界")) fmt.Printf("b2: %v\n", buffer) }
(3).写入并读出
package main import ( "bytes" "fmt" ) func main() { var b bytes.Buffer writeString, err := b.WriteString("hello") if err != nil { fmt.Printf("%v\n", err) } fmt.Printf("%v\n", writeString) i := b.Bytes() fmt.Printf("%v\n", string(i)) }
16.标准库之errors
errors包实现了错误的函数
,Go语言使用error类型来返回函数执行过程中遇到的错误,如果返回的errror值为nil,则表示遇到错误,否则errror会返回一个字符串,用于说明遇到了什么错误。
type error interface{ Errorr() }
我们可以用任何类型去实现它,(只要添加一个Error方法即可)。error不一定表示一个错误,它可以表示任何的信息,不一定是字符串。比如io包中使用error类型的 io.EOF表示数据读取结束,而不是遇到了什么错误。
(1). errors.new(“”)
errors包实现了一个最简单的errror类型,只包含一个字符串,它可以记录大多数情况遇到的错误信息。errors包的用法也很简单,只有一个New函数,只有一个 New 函数,用于生成一个最简单的error对象
。
package main import ( "errors" "fmt" ) func check(s string) (string, error) { if s == "" { err := errors.New("字符串不能为空") //创建一个简单的报错信息 return "nil", err } else { return s, nil } } func main() { s, err := check("") fmt.Printf("字符串是: %v\t 报错信息: %v\n", s, err) }
(2).自定义错误
package main import ( "fmt" "time" ) type MyError struct { when time.Time what string } func (my MyError) Error() string { // 结构体实现Error的接口, return fmt.Sprintf("%v;%v", my.when, my.what) // 这里打印的是一个字符串 } func opps() error { //返回错误的对象 return MyError{ time.Now(), "这个文件已经过期!", } } func main() { if err := opps(); err != nil { fmt.Printf("%v", err) } }
17.标准库之sort
sort包提供了排序切片和用户自定义数据集以及相关功能的函数。
sort包主要针对 []int、 []float64、[]string、以及其他自定义切片的排序。
(1).常用方法
18.标准库之json
这个包可以实现json的编码和解码,就是将json字符串转换为struct,或者将struct转换成json。
核心的两个函数
- 将struct编写成json,可以接受任意类型
func Marshal(v interface{}) ([]byte,error)
- 将json转换成struct结构体
func Unmarshal(data []byte, v interface{}) error
两个核心结构体
从输入流读取并解析json
type Decode struct{}
写json到输出流
type Encoder struct{}
(1).结构体转json
package main import ( "encoding/json" "fmt" ) type Person struct { Name string Age int Email string } func main() { person := Person{"tom", 20, "2261203961@qq.com"} marshal, _ := json.Marshal(person) fmt.Printf("%v", string(marshal)) }
(2).json转换结构体
也可以解析嵌套结构体
package main import ( "encoding/json" "fmt" ) type Person struct { Name string Age int Email string } func main() { bytes := []byte(`{"Name":"tom","Age":20,"Email":"2261203961@qq.com"}`) // 这里是反引号 不是单引号 var m Person json.Unmarshal(bytes, &m) fmt.Printf("%v\n", m) }
19.标准库之encoding/xml
核心的两个函数
将struct转换成xml
func Marshal(v interface{}) ([]byte,error)
将xml转换成struct结构体
func Unmarshal(data []byte, v intreface{}) error
两个核心结构体
从输入流读取并解析xml
type Decoder struct{..}
写xml到输出流
type Encoder structer{..}
(1).结构体转xml
package main import ( "encoding/xml" "fmt" ) type Person struct { XMLName xml.Name `xml:"person"` //反引号 Name string `xml:"name"` Age int `xml:"age"` Email string `xml:"email"` } func main() { person := Person{ Name: "tom", Age: 20, Email: "sdsds.com", } b, _ := xml.MarshalIndent(person, " ", " ") //美化 fmt.Printf("%v", string(b)) }
(2).xml转结构体
package main import ( "encoding/xml" "fmt" ) type Person struct { XMLName xml.Name `xml:"person"` //反引号 Name string `xml:"name"` Age int `xml:"age"` Email string `xml:"email"` } func main() { s := ` <person> <name>tom</name> <age>20</age> <email>sdsds.com</email> </person> ` bytes := []byte(s) var per Person xml.Unmarshal(bytes, &per) fmt.Printf("%v", per) }