Golang input/output: Difference between revisions
From wikinotes
No edit summary |
|||
Line 19: | Line 19: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
</blockquote><!-- stdin, stdout, stderr --> | </blockquote><!-- stdin, stdout, stderr --> | ||
= Reader, Writer = | |||
<blockquote> | |||
<syntaxhighlight lang="go"> | |||
</syntaxhighlight> | |||
<syntaxhighlight lang="go"> | |||
// read a file into `[]bytes` until EOF | |||
conts, err := os.ReadAll(reader) | |||
</syntaxhighlight> | |||
<syntaxhighlight lang="go"> | |||
buf := make([]byte, 64) | |||
_, err := os.ReadFull(reader, buf) // fill buffer to capacity, reading from reader | |||
switch { | |||
case errors.Is(err, EOF): | |||
// nothing to read (0 bytes) | |||
case errors.Is(err, ErrUnexpectedEOF): | |||
// end of file, before filling buffer | |||
} | |||
</syntaxhighlight> | |||
<syntaxhighlight lang="go"> | |||
_, err := os.WriteString(writer, "abcd") | |||
</syntaxhighlight> | |||
</blockquote><!-- Reader, Writer --> | |||
= Files = | = Files = | ||
<blockquote> | <blockquote> | ||
If the files are small, you can work with them using <code>os</code> | |||
<syntaxhighlight lang="go"> | <syntaxhighlight lang="go"> | ||
require "os" | require "os" | ||
filepath = "/var/tmp/foo.txt" | |||
contents = []byte("abc") | |||
err := os.WriteFile(filepath, contents, 0644) | |||
conts, err := os.ReadFile(filepath) | |||
</syntaxhighlight> | |||
If the files are larger, read in in chunks. | |||
<syntaxhighlight lang="go"> | |||
func check(e error) { | |||
if e != nil { | |||
panic(e) | |||
} | |||
} | |||
// create or open file for reading | |||
filepath = "/var/tmp/foo.txt" | |||
fd, err := os.Open(filepath) // open for reading | |||
fd, err := os.Create(filepath) // create, or truncate file (0666 perms) | |||
check(err) | |||
// read up to 5 bytes | |||
buf := make([]byte, 5) | |||
bytes_read, err := fd.Read(buf) | |||
check(err) | |||
</syntaxhighlight> | </syntaxhighlight> | ||
</blockquote><!-- Files --> | </blockquote><!-- Files --> |
Revision as of 18:07, 18 June 2022
Documentation
fmt
https://pkg.go.dev/fmt@go1.18.2 io/ioutil
(read/write)https://pkg.go.dev/io/ioutil@go1.18.3 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
// read a file into `[]bytes` until EOF conts, err := os.ReadAll(reader)buf := make([]byte, 64) _, err := os.ReadFull(reader, buf) // fill buffer to capacity, reading from reader switch { case errors.Is(err, EOF): // nothing to read (0 bytes) case errors.Is(err, ErrUnexpectedEOF): // end of file, before filling buffer }_, err := os.WriteString(writer, "abcd")
Files
If the files are small, you can work with them using
os
require "os" filepath = "/var/tmp/foo.txt" contents = []byte("abc") err := os.WriteFile(filepath, contents, 0644) conts, err := os.ReadFile(filepath)If the files are larger, read in in chunks.
func check(e error) { if e != nil { panic(e) } } // create or open file for reading filepath = "/var/tmp/foo.txt" fd, err := os.Open(filepath) // open for reading fd, err := os.Create(filepath) // create, or truncate file (0666 perms) check(err) // read up to 5 bytes buf := make([]byte, 5) bytes_read, err := fd.Read(buf) check(err)
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