i.복사
func Copy(dst Writer, src Reader) (written int64, err error)
io.Reader 또는 io.Writer 간에 데이터를 복사하는 데 사용되며 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)
}
i.CopyBuffer
func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error)
io.Reader와 io.Writer 사이에서 데이터를 버퍼링하고 복사하는 데 사용되며, io.Copy 함수와 달리 버퍼 크기는 io.CopyBuffer를 사용하여 수동으로 제어할 수 있습니다. buf가 nil이면 하나가 할당되고 길이가 0이면 패닉이 발생합니다. 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
}
i.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에서 최소한 최소 바이트를 읽으려고 시도합니다. 데이터가 충분하지 않으면 요청한 수를 읽을 수 없다는 오류를 반환합니다. 바이트. 간단한 사용 예는 다음과 같습니다.
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에서 buf로 len(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)
}
}