107.【并发与标准库】(十)

简介: 107.【并发与标准库】

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。

核心的两个函数

  1. 将struct编写成json,可以接受任意类型
func Marshal(v interface{}) ([]byte,error)
  1. 将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)
}

相关文章
|
缓存 Go
107.【并发与标准库】(二)
107.【并发与标准库】
47 0
|
缓存 Go C语言
107.【并发与标准库】(七)
107.【并发与标准库】
51 0
|
缓存 索引
107.【并发与标准库】(九)
107.【并发与标准库】
36 0
|
2月前
|
Go 调度
Goroutine:Go语言的轻量级并发机制
【8月更文挑战第31天】
34 0
|
3月前
|
安全 Go
Go语言map并发安全,互斥锁和读写锁谁更优?
Go并发编程中,`sync.Mutex`提供独占访问,适合读写操作均衡或写操作频繁的场景;`sync.RWMutex`允许多个读取者并行,适用于读多写少的情况。明智选择锁可提升程序性能和稳定性。示例展示了如何在操作map时使用这两种锁。
52 0
|
3月前
|
安全 Go 开发者
Go语言map并发安全使用的正确姿势
在Go并发编程中,由于普通map不是线程安全的,多goroutine访问可能导致数据竞态。为保证安全,可使用`sync.Mutex`封装map或使用从Go 1.9开始提供的`sync.Map`。前者通过加锁手动同步,后者内置并发控制,适用于多goroutine共享。选择哪种取决于具体场景和性能需求。
52 0
107.【并发与标准库】(三)
107.【并发与标准库】
49 0
|
存储
107.【并发与标准库】(四)
107.【并发与标准库】
49 0
|
5月前
|
Go 调度 计算机视觉
并发与并行:Go语言中的异曲同工
并发与并行:Go语言中的异曲同工
47 0