成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Golang 中的 IO 包詳解:常用的可導出函數詳解

開發 后端
從 Reader 中讀取數據并寫入到 Writer 中,直到無法再從 Reader 中讀取到任何數據(EOF)或發生錯誤,返回被復制的字節數和任何發生的錯誤信息。

io.Copy

func Copy(dst Writer, src Reader) (written int64, err error)

用于在 io.Reader 或 io.Writer 之間復制數據,接受兩個參數,一個 Writer 和一個 Reader。從 Reader 中讀取數據并寫入到 Writer 中,直到無法再從 Reader 中讀取到任何數據(EOF)或發生錯誤,返回被復制的字節數和任何發生的錯誤信息。簡單的使用示例如下:

package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	src, err := os.Open("src.txt")
	if err != nil {
		panic(err)
	}
	defer src.Close()

	dst, err := os.Create("dst.txt")
	if err != nil {
		panic(err)
	}
	defer dst.Close()

	written, err := io.Copy(dst, src)
	if err != nil {
		panic(err)
	}
	fmt.Printf("Copied %d bytes\n", written)
}

io.CopyBuffer

func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error)

用于在 io.Reader 和 io.Writer 之間緩沖復制數據,與 io.Copy 函數不同的是,使用 io.CopyBuffer 可以手動控制緩沖區的大小。如果 buf 為 nil,則分配一個;如果長度為零,則會觸發 panic。io.CopyBuffer 避免了 io.Copy 可能出現的大內存使用問題,因為可以使用具有固定大小的緩沖區,所以可以更好地控制內存使用、提高性能。簡單使用示例如下:

package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	src, err := os.Open("src.txt")
	if err != nil {
		panic(err)
	}
	defer src.Close()

	dst, err := os.Create("dst.txt")
	if err != nil {
		panic(err)
	}
	defer dst.Close()

	buf := make([]byte, 4)
	written, err := io.CopyBuffer(dst, src, buf)
	if err != nil {
		panic(err)
	}
	fmt.Printf("Copied %d bytes\n", written)
}

io.CopyN

func CopyN(dst Writer, src Reader, n int64) (written int64, err error)

用于從 io.Reader 中讀取指定數量的字節數并寫入 io.Writer 中。與 io.Copy 函數不同的是,會從源 io.Reader 中讀取 n 個字節并寫入到目標 io.Writer 中,從源讀入了指定數量的字節數據后就會停止。簡單使用示例如下:

package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	src, err := os.Open("file.txt")
	if err != nil {
		panic(err)
	}
	defer src.Close()

	dst, err := os.Create("dst.txt")
	if err != nil {
		panic(err)
	}
	defer dst.Close()

	written, _ := io.CopyN(dst, src, 5)
	fmt.Printf("Copied %d bytes\n", written)
}

io.LimitReader

func LimitReader(r Reader, n int64) Reader

從 io.Reader 中讀取數據,最多返回 n 個字節。如果讀取數據時提前達到了這個限制,io.Reader 就會返回 io.EOF 錯誤(表示已經讀取到了流的末尾)。簡單使用示例如下:

package main

import (
	"fmt"
	"io"
	"strings"
)

func main() {
	data := "Hello, World!"
	reader := strings.NewReader(data)
	limit := int64(5)
	limitedReader := io.LimitReader(reader, limit)
	buf := make([]byte, limit)
	limitedReader.Read(buf)
	fmt.Printf("%s\n", buf) // 輸出: Hello
}

io.ReadAll

func ReadAll(r Reader) ([]byte, error)

用于讀取指定 io.Reader 中所有數據,不限制讀取數據的大小。簡單使用示例如下:

package main

import (
	"fmt"
	"io"
	"strings"
)

func main() {
	r := strings.NewReader("路多辛的博客,分享后端領域知識與經驗")
	b, err := io.ReadAll(r)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(b))
}

io.ReadAtLeast

func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error)

用于從 io.Reader 中讀取至少指定數量字節的數據,會嘗試從 io.Reader 中讀取至少 min 個字節,如果數據不足,會返回一個無法讀取請求的字節數錯誤。簡單使用示例如下:

package main

import (
	"fmt"
	"io"
	"log"
	"strings"
)

func main() {
	r := strings.NewReader("路多辛的博客,分享后端領域知識與經驗")
	buf := make([]byte, 18)
	if _, err := io.ReadAtLeast(r, buf, 6); err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", buf)


	shortBuf := make([]byte, 3)
	if _, err := io.ReadAtLeast(r, shortBuf, 4); err != nil {
		fmt.Println("error:", err)
	}


	longBuf := make([]byte, 64)
	if _, err := io.ReadAtLeast(r, longBuf, 64); err != nil {
		fmt.Println("error:", err)
	}
}

io.ReadFull

func ReadFull(r Reader, buf []byte) (n int, err error)

用于從 io.Reader 中讀取 len(buf)個字節到 buf 中。如果數據不足,會返回一個無法讀取請求的字節數的錯誤。簡單使用示例如下:

package main

import (
	"fmt"
	"io"
	"strings"
)

func main() {
	r := strings.NewReader("路多辛的博客,分享后端領域知識與經驗")

	buf := make([]byte, 18)
	if _, err := io.ReadFull(r, buf); err != nil {
		panic(err)
	}
	fmt.Println(string(buf))

	longBuf := make([]byte, 64)
	if _, err := io.ReadFull(r, longBuf); err != nil {
		panic(err)
	}
}
責任編輯:姜華 來源: 今日頭條
相關推薦

2023-11-27 15:02:37

BytesGolang

2023-10-18 08:22:38

BufioGolang

2023-08-03 08:48:07

Golang接口

2023-08-02 09:07:27

Golangio 包

2023-08-28 17:16:51

Golangio 包

2023-08-08 14:51:29

2023-08-07 09:18:32

Golang偏移量接口

2023-10-31 09:10:39

2023-11-07 09:02:07

Golangbytes

2023-09-06 09:10:04

Golang字符串

2023-09-07 07:35:54

GolangBufio

2023-09-04 08:17:37

Golangstrings 包

2024-01-18 09:07:04

Errors函數Golang

2023-09-05 08:22:44

Golangstrings 包

2023-10-10 08:57:44

Golangbufio

2023-11-03 08:53:15

StrconvGolang

2023-10-07 09:08:32

Golangbufio

2023-11-29 07:47:29

Golang函數

2023-05-12 09:40:53

ContextGolang

2023-06-27 08:45:19

原子操作Golang
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产综合久久婷婷香蕉 | 欧美一区二区在线看 | 一道本在线 | 亚洲毛片在线观看 | 91av入口| 一区二区三区在线电影 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 免费观看成人鲁鲁鲁鲁鲁视频 | 一区二区三区亚洲 | 国产一区二区高清在线 | 久久99国产精品 | 99久久视频 | 一级视频在线免费观看 | 欧美成人精品 | 亚洲色图婷婷 | 蜜臀久久99精品久久久久久宅男 | 视频一区二区中文字幕 | 中文字幕1区2区3区 亚洲国产成人精品女人久久久 | 欧美日本韩国一区二区 | 妖精视频一区二区三区 | 国产精品久久久久久久免费大片 | 欧美日韩一区在线播放 | 最新国产视频 | 午夜在线免费观看视频 | 九色视频网站 | 亚洲视频一区 | 亚洲成人免费网址 | 成人欧美一区二区三区白人 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | 欧美一级免费看 | 91精品入口蜜桃 | 五月天国产视频 | 亚洲精品一区中文字幕乱码 | 国产无人区一区二区三区 | 欧美国产日韩一区二区三区 | 亚洲在线看 | 黄色一级电影免费观看 | 久久99精品久久久水蜜桃 | 日韩精品免费视频 | 欧美日韩国产一区二区三区不卡 | 一级黄色片在线免费观看 |