提交 ad92643e 编写于 作者: 彭世瑜's avatar 彭世瑜

fix

上级 5d3d6030
# Golang标准库-bufio
bufio库实现了有缓冲的I/O
读示例
```go
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
reader := strings.NewReader("hello world")
bufReader := bufio.NewReader(reader)
s, _ := bufReader.ReadString('\n')
fmt.Printf("s: %v\n", s)
// s: hello world
}
```
写示例
```go
package main
import (
"bufio"
"os"
)
func main() {
f, _ := os.OpenFile("demo.txt", os.O_RDWR, 0777)
defer f.Close()
w := bufio.NewWriter(f)
w.WriteString("hello")
w.Flush()
}
```
Scanner 示例
```go
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
r := strings.NewReader("AAA BBB CCC")
s := bufio.NewScanner(r)
s.Split(bufio.ScanWords)
for s.Scan() {
fmt.Printf("s.Text(): %v\n", s.Text())
}
// s.Text(): AAA
// s.Text(): BBB
// s.Text(): CCC
}
```
# Golang标准库-io输入输出
io包封装了如下操作
- io 为IO原语操作(I/O primitives)提供基本的接口 os、File、Reader、Writer
- io/ioutil 封装了一些实用函数
- fmt 实现了格式化I/O,类似C语言中的printf 和 scanf
- bufio 实现带缓冲的I/O
基本的IO接口
```go
type Reader interface {
Read(p []byte) (n int, err error)
}
type Writer interface {
Write(p []byte) (n int, err error)
}
```
以下类型实现了Reader和Writer接口
```go
os.File (Reader和Writer)
strings.Reader (Reader)
bufio.Reader (Reader)
bufio.Writer (Writer)
bytes.Buffer (Reader和Writer)
bytes.Reader (Reader)
compress/gzip.Reader (Reader)
compress/gzip.Writer (Writer)
crypto/cipher.StreamReader (Reader)
crypto/cipher.StreamWriter (Writer)
crypto/tls.Conn (Reader和Writer)
encoding/csv.Reader (Reader)
encoding/csv.Writer (Writer)
```
示例
```go
package main
import (
"fmt"
"strings"
)
func main() {
r := strings.NewReader("Hello world")
buf := make([]byte, 5)
n, err := r.Read(buf)
if err != nil {
fmt.Printf("err: %v\n", err)
} else {
fmt.Printf("n: %v\n", n)
// n: 5
fmt.Printf("buf: %v\n", string(buf))
// buf: Hello
}
}
```
reader拷贝到writer
```go
package main
import (
"fmt"
"io"
"os"
"strings"
)
func main() {
r := strings.NewReader("Hello world")
// 复制到标准输出流,实际效果为:打印到控制台
_, err := io.Copy(os.Stdout, r)
if err != nil {
fmt.Printf("err: %v\n", err)
}
// Hello world
}
```
带缓冲区的拷贝
```go
package main
import (
"fmt"
"io"
"os"
"strings"
)
func main() {
r := strings.NewReader("Hello world")
buf := make([]byte, 8)
_, err := io.CopyBuffer(os.Stdout, r, buf)
if err != nil {
fmt.Printf("err: %v\n", err)
}
// Hello world
}
```
# Golang标准库-ioutil
| 函数名 | 作用
| - | -
| ReadAll | 读取数据,返回读到的字节slice
| ReadDir | 读取一个目录,返回目录入口数组 []os.FileInfo
| ReadFile | 读取文件,返回文件内容(字节slice)
| WriteFile| 根据文件路径,写入字节slice
| TempDir| 在一个目录中创建指定前缀名的临时目录,返回新临时目录的路径
| TempFile| 在一个目录中创建指定前缀名的临时文件,返回os.File
示例
```go
package main
import (
"fmt"
"io/ioutil"
"strings"
)
func main() {
r := strings.NewReader("Hello world")
b, err := ioutil.ReadAll(r)
if err != nil {
fmt.Printf("err: %v\n", err)
} else {
fmt.Printf("string(b): %v\n", string(b))
// string(b): Hello world
}
}
```
从文件中读取
```go
package main
import (
"fmt"
"io/ioutil"
"os"
)
func main() {
f, _ := os.Open("demo.txt")
defer f.Close()
b, err := ioutil.ReadAll(f)
if err != nil {
fmt.Printf("err: %v\n", err)
} else {
fmt.Printf("string(b): %v\n", string(b))
// string(b): Hello world
}
}
```
读取当前目录下所有文件
```go
package main
import (
"fmt"
"io/ioutil"
)
func main() {
fi, _ := ioutil.ReadDir(".")
for _, v := range fi {
fmt.Printf("v.Name(): %v\n", v.Name())
}
}
```
读取文件
```go
package main
import (
"fmt"
"io/ioutil"
)
func main() {
b, _ := ioutil.ReadFile("demo.txt")
fmt.Printf("string(b): %v\n", string(b))
}
```
写入文件内容
```go
package main
import (
"io/ioutil"
)
func main() {
ioutil.WriteFile("demo.txt", []byte("hello"), 0644)
}
```
临时文件
```go
package main
import (
"io/ioutil"
"log"
"os"
)
func main() {
// 创建临时文件
tempfile, err := ioutil.TempFile("", "temp")
if err != nil {
log.Fatal(err)
}
// 函数结束移除临时文件
defer os.Remove(tempfile.Name()) // clean up
// 向临时文件写入字节数组
content := []byte("hello world")
if _, err := tempfile.Write(content); err != nil {
log.Fatal(err)
}
if err := tempfile.Close(); err != nil {
log.Fatal(err)
}
}
```
\ No newline at end of file
# Golang标准库-log
log包,实现了简单的日志服务
log包中有3个系列的日志打印函数
函数系列 | 作用
- | -
print | 单纯的打印日志
panic | 打印日志,抛出panic异常
fatal | 打印日志,强制结束程序`os.Exit(1)`, `defer` 函数不会执行
Print 示例
```go
package main
import (
"log"
)
func main() {
log.Print("Hello")
// 2022/10/07 15:24:38 Hello
log.Println("Hello")
// 2022/10/07 15:25:08 Hello\n
log.Printf("Hello %d", 20)
// 2022/10/07 15:25:08 Hello 20
}
```
Panic 示例
```go
package main
import (
"fmt"
"log"
)
func main() {
defer fmt.Println("defer")
log.Panic("Hello")
fmt.Println("after Panic")
// 2022/10/07 15:27:10 Hello
// defer
// panic: Hello
}
```
Fatal 示例
```go
package main
import (
"fmt"
"log"
)
func main() {
defer fmt.Println("defer")
log.Fatal("Hello")
fmt.Println("after Panic")
// 2022/10/07 15:28:48 Hello
// exit status 1
}
```
log配置
```go
package main
import (
"log"
"os"
)
func init() {
// 输出格式 长日期 长时间 短文件名
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
// 设置前缀
log.SetPrefix("main: ")
// 设置日志输出文件
f, err := os.OpenFile("demo.log", os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0664)
// defer f.Close()
if err != nil {
log.Fatal("日志文件打开错误")
}
log.SetOutput(f)
}
func main() {
log.Print("Hello")
// main: 2022/10/07 15:35:13 main.go:16: Hello
}
```
自定义logger
```go
package main
import (
"log"
"os"
)
var logger *log.Logger
func init() {
// func New(out io.Writer, prefix string, flag int) *Logger
logger = log.New(os.Stdout, "main: ", log.Ldate|log.Ltime|log.Lshortfile)
}
func main() {
logger.Print("Hello")
// main: 2022/10/07 15:35:13 main.go:16: Hello
}
```
\ No newline at end of file
# 第二十一章 Golang标准库
# Golang标准库-os
标准库文档:https://pkg.go.dev/std
......@@ -509,119 +509,3 @@ func main() {
}
```
## io模块-输入输出
io包封装了如下操作
- io 为IO原语操作(I/O primitives)提供基本的接口 os、File、Reader、Writer
- io/ioutil 封装了一些实用函数
- fmt 实现了格式化I/O,类似C语言中的printf 和 scanf
- bufio 实现带缓冲的I/O
基本的IO接口
```go
type Reader interface {
Read(p []byte) (n int, err error)
}
type Writer interface {
Write(p []byte) (n int, err error)
}
```
以下类型实现了Reader和Writer接口
```go
os.File (Reader和Writer)
strings.Reader (Reader)
bufio.Reader (Reader)
bufio.Writer (Writer)
bytes.Buffer (Reader和Writer)
bytes.Reader (Reader)
compress/gzip.Reader (Reader)
compress/gzip.Writer (Writer)
crypto/cipher.StreamReader (Reader)
crypto/cipher.StreamWriter (Writer)
crypto/tls.Conn (Reader和Writer)
encoding/csv.Reader (Reader)
encoding/csv.Writer (Writer)
```
示例
```go
package main
import (
"fmt"
"strings"
)
func main() {
r := strings.NewReader("Hello world")
buf := make([]byte, 5)
n, err := r.Read(buf)
if err != nil {
fmt.Printf("err: %v\n", err)
} else {
fmt.Printf("n: %v\n", n)
// n: 5
fmt.Printf("buf: %v\n", string(buf))
// buf: Hello
}
}
```
reader拷贝到writer
```go
package main
import (
"fmt"
"io"
"os"
"strings"
)
func main() {
r := strings.NewReader("Hello world")
// 复制到标准输出流,实际效果为:打印到控制台
_, err := io.Copy(os.Stdout, r)
if err != nil {
fmt.Printf("err: %v\n", err)
}
// Hello world
}
```
带缓冲区的拷贝
```go
package main
import (
"fmt"
"io"
"os"
"strings"
)
func main() {
r := strings.NewReader("Hello world")
buf := make([]byte, 8)
_, err := io.CopyBuffer(os.Stdout, r, buf)
if err != nil {
fmt.Printf("err: %v\n", err)
}
// Hello world
}
```
\ No newline at end of file
......@@ -48,10 +48,16 @@
[第二十章 Golang 并发编程](/blog/golang/golang-concurrency.md)
[第二十一章 Golang标准库](/blog/golang/golang-standard.md)
第二十一章 Golang标准库
- [Golang标准库-os](/blog/golang/golang-standard-os.md)
- [Golang标准库-io输入输出](/blog/golang/golang-standard-io.md)
- [Golang标准库-ioutil](/blog/golang/golang-standard-ioutil.md)
- [Golang标准库-bufio](/blog/golang/golang-standard-bufio.md)
- [Golang标准库-log](/blog/golang/golang-standard-log.md)
- [Golang标准库-builtin](/blog/golang/golang-standard-builtin.md)
https://www.bilibili.com/video/BV1ME411Y71o?p=27&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da
https://www.bilibili.com/video/BV1zR4y1t7Wj?p=84&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da
\ No newline at end of file
https://www.bilibili.com/video/BV1zR4y1t7Wj?p=89&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册