Golang input/output: Difference between revisions
From wikinotes
(37 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
Sending/Receiving and Writing/Reading.<br> | |||
You may also be interested in [[golang filesystem]]. | |||
= Documentation = | = Documentation = | ||
<blockquote> | <blockquote> | ||
Line 5: | Line 8: | ||
| <code>fmt</code> || https://pkg.go.dev/fmt@go1.18.2 | | <code>fmt</code> || https://pkg.go.dev/fmt@go1.18.2 | ||
|- | |- | ||
| <code> | | <code>os</code> (open files) || https://pkg.go.dev/os@go1.18.3 | ||
|- | |- | ||
| <code> | | <code>bufio.Reader</code> || https://pkg.go.dev/bufio@go1.18.3#Reader | ||
|- | |||
| <code>bufio.Writer</code> || https://pkg.go.dev/bufio@go1.18.3#Writer | |||
|- | |- | ||
| <code>textproto</code> (sockets) || https://pkg.go.dev/net/textproto@go1.18.3 | | <code>textproto</code> (sockets) || https://pkg.go.dev/net/textproto@go1.18.3 | ||
Line 14: | Line 19: | ||
</blockquote><!-- Documentation --> | </blockquote><!-- Documentation --> | ||
= | = Stdin, Stdout, Stderr = | ||
<blockquote> | <blockquote> | ||
<syntaxhighlight lang="go"> | <syntaxhighlight lang="go"> | ||
fmt.Fprintln(os.Stdout, "writes stdout") | |||
fmt.Fprintln(os.Stderr, "writes stderr") | |||
fmt. | |||
fmt. | |||
</syntaxhighlight> | </syntaxhighlight> | ||
</blockquote><!-- | </blockquote><!-- stdin, stdout, stderr --> | ||
= | = Reader, Writer Interfaces = | ||
<blockquote> | <blockquote> | ||
The <code>bufio.Reader</code>, <code>bufio.Writer</code> interfaces described under the File header are general purpose. | |||
Several types of objects may abstract their access using this interface. | |||
<syntaxhighlight lang=" | <syntaxhighlight lang="go"> | ||
// reader | |||
strings.NewReader("abc\ndef") // strings | |||
os.Open("file.txt") // file | |||
os.OpenFile("file.txt", // file | |||
os.o_RDWR|os.O_APPEND, | |||
0644) | |||
// writer | |||
writer := new(strings.Builder) // strings | |||
os.Create("file.txt") // file | |||
os.OpenFile("file.txt", // file | |||
os.o_RDWR|os.O_APPEND, | |||
0644) | |||
</syntaxhighlight> | </syntaxhighlight> | ||
</blockquote><!-- | </blockquote><!-- Reader, Writer --> | ||
= | = Files = | ||
<blockquote> | <blockquote> | ||
< | If the files are small, you can work with them using <code>os</code> | ||
</ | |||
= | == Reading == | ||
<blockquote> | <blockquote> | ||
Small Files | |||
<syntaxhighlight lang="go"> | <syntaxhighlight lang="go"> | ||
import "os" | |||
// read entire file into []byte | |||
conts, err := os.ReadFile("/var/tmp/foo.txt") | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Buffered Reading | |||
<syntaxhighlight lang="go"> | <syntaxhighlight lang="go"> | ||
// create or open file for reading | |||
fd, err := os.Open("/var/tmp/foo.txt") // open for reading | |||
// | fd, err := os.OpenFile("/var/tmp/foo.txt", // open, setting open-mode flags | ||
os.O_RDWR|os.O_APPEND, | |||
fd, err := os. | 0644) | ||
defer fd.Close() | |||
// | // read up to 5 bytes | ||
buf := make([]byte, 5) | |||
bytes_r, err := fd.Read(buf) | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Auto-Buffered Reader | |||
<syntaxhighlight lang="go"> | <syntaxhighlight lang="go"> | ||
fd, err := os.OpenFile("/var/tmp/foo.txt", // open, setting open-mode flags | |||
os.O_RDWR|os.O_APPEND, | |||
0644) | |||
defer fd.Close() | |||
reader := bufio.NewReader(fd) | |||
bytes, err := reader.ReadBytes("\n") // read all characters until first occurrence of '\n' | |||
string, err := reader.ReadString("\n") // read all characters until first occurrence of '\n' | |||
err := | |||
</syntaxhighlight> | </syntaxhighlight> | ||
You may also find it useful to gradually fill a buffer to process large files | |||
<syntaxhighlight lang="go"> | <syntaxhighlight lang="go"> | ||
// | // fill buffer to capacity, reading from reader | ||
buf := make([]byte, 64) | |||
_, err := os.ReadFull(reader, buf) | |||
switch { | |||
case errors.Is(err, os.EOF): | |||
// nothing to read (0 bytes) | |||
case errors.Is(err, os.ErrUnexpectedEOF): | |||
// end of file, before filling buffer | |||
} | |||
</syntaxhighlight> | </syntaxhighlight> | ||
</blockquote><!-- | </blockquote><!-- Reading --> | ||
== | == Writing == | ||
<blockquote> | <blockquote> | ||
Small Files | |||
<syntaxhighlight lang="go"> | <syntaxhighlight lang="go"> | ||
import "os" | |||
// replace file (creating if necessary) | |||
err := os.WriteFile("/var/tmp/foo.txt", []byte("abc"), 0644) | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Manually Buffered Writing | |||
<syntaxhighlight lang="go"> | <syntaxhighlight lang="go"> | ||
// | fd, err := os.Create(filepath) // create, or truncate file (0666 perms) | ||
fd, err := os.OpenFile("/var/tmp/foo.txt", // open, setting open-mode flags | |||
os.O_RDWR|os.O_APPEND, | |||
0644) | |||
defer fd.Close() | |||
bytes_w, err := fd.Write([]byte("abc")) | |||
bytes_w, err := fd.WriteString("abc") | |||
fd.Sync() // sync writes to disk | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Auto Buffered Writer | |||
<syntaxhighlight lang="go"> | <syntaxhighlight lang="go"> | ||
import "os" | |||
import "bufio" | |||
= | fd, err := os.OpenFile("foo.txt", os.O_WRONLY|os.O_APPEND, 0644) | ||
defer fd.Close() | |||
writer := bufio.NewWriter(fd) | |||
bytes_w, err := writer.Write([]byte("abc")) | |||
bytes_w, err := writer.WriteString("abc") | |||
writer.Flush() // ensure all writes written to disk before closing | |||
</syntaxhighlight> | </syntaxhighlight> | ||
</blockquote><!-- Writing --> | |||
</blockquote><!-- Files --> | </blockquote><!-- Files --> | ||
Line 195: | Line 159: | ||
conn, err = net.Dial("tcp", "10.10.10.10:6600") | conn, err = net.Dial("tcp", "10.10.10.10:6600") | ||
defer conn.Close() | defer conn.Close() | ||
</syntaxhighlight> | |||
<syntaxhighlight lang="go"> | |||
// sending message to socket | // sending message to socket | ||
_, err = conn.Write([]byte("search title 'it ceases to be'")) | _, err = conn.Write([]byte("search title 'it ceases to be'")) |
Latest revision as of 00:59, 26 June 2022
Sending/Receiving and Writing/Reading.
You may also be interested in golang filesystem.
Documentation
fmt
https://pkg.go.dev/fmt@go1.18.2 os
(open files)https://pkg.go.dev/os@go1.18.3 bufio.Reader
https://pkg.go.dev/bufio@go1.18.3#Reader bufio.Writer
https://pkg.go.dev/bufio@go1.18.3#Writer textproto
(sockets)https://pkg.go.dev/net/textproto@go1.18.3
Stdin, Stdout, Stderr
fmt.Fprintln(os.Stdout, "writes stdout") fmt.Fprintln(os.Stderr, "writes stderr")
Reader, Writer Interfaces
The
bufio.Reader
,bufio.Writer
interfaces described under the File header are general purpose. Several types of objects may abstract their access using this interface.// reader strings.NewReader("abc\ndef") // strings os.Open("file.txt") // file os.OpenFile("file.txt", // file os.o_RDWR|os.O_APPEND, 0644) // writer writer := new(strings.Builder) // strings os.Create("file.txt") // file os.OpenFile("file.txt", // file os.o_RDWR|os.O_APPEND, 0644)
Files
If the files are small, you can work with them using
os
Reading
Small Files
import "os" // read entire file into []byte conts, err := os.ReadFile("/var/tmp/foo.txt")Buffered Reading
// create or open file for reading fd, err := os.Open("/var/tmp/foo.txt") // open for reading fd, err := os.OpenFile("/var/tmp/foo.txt", // open, setting open-mode flags os.O_RDWR|os.O_APPEND, 0644) defer fd.Close() // read up to 5 bytes buf := make([]byte, 5) bytes_r, err := fd.Read(buf)Auto-Buffered Reader
fd, err := os.OpenFile("/var/tmp/foo.txt", // open, setting open-mode flags os.O_RDWR|os.O_APPEND, 0644) defer fd.Close() reader := bufio.NewReader(fd) bytes, err := reader.ReadBytes("\n") // read all characters until first occurrence of '\n' string, err := reader.ReadString("\n") // read all characters until first occurrence of '\n'You may also find it useful to gradually fill a buffer to process large files
// fill buffer to capacity, reading from reader buf := make([]byte, 64) _, err := os.ReadFull(reader, buf) switch { case errors.Is(err, os.EOF): // nothing to read (0 bytes) case errors.Is(err, os.ErrUnexpectedEOF): // end of file, before filling buffer }Writing
Small Files
import "os" // replace file (creating if necessary) err := os.WriteFile("/var/tmp/foo.txt", []byte("abc"), 0644)Manually Buffered Writing
fd, err := os.Create(filepath) // create, or truncate file (0666 perms) fd, err := os.OpenFile("/var/tmp/foo.txt", // open, setting open-mode flags os.O_RDWR|os.O_APPEND, 0644) defer fd.Close() bytes_w, err := fd.Write([]byte("abc")) bytes_w, err := fd.WriteString("abc") fd.Sync() // sync writes to diskAuto Buffered Writer
import "os" import "bufio" fd, err := os.OpenFile("foo.txt", os.O_WRONLY|os.O_APPEND, 0644) defer fd.Close() writer := bufio.NewWriter(fd) bytes_w, err := writer.Write([]byte("abc")) bytes_w, err := writer.WriteString("abc") writer.Flush() // ensure all writes written to disk before closing
Networking
Sockets
net.Dial()
creates sockets of various types.import "net" // unix socketfile conn, err = net.Dial("unix", "/var/tmp/foo.sock") // inet socket conn, err = net.Dial("tcp", "10.10.10.10:6600") defer conn.Close()// sending message to socket _, err = conn.Write([]byte("search title 'it ceases to be'")) reply := make([]byte, 1024) _, err = conn.Read(reply) fmt.Println(string(reply))HTTP