Golang input/output: Difference between revisions

From wikinotes
No edit summary
Line 22: Line 22:
= Reader, Writer =
= Reader, Writer =
<blockquote>
<blockquote>
Reading/Writing small files
<syntaxhighlight lang="go">
// read entire file
conts, err := os.ReadFile("/var/foo.txt")
// create/replace file
buf := []byte("foo bar baz\n")
os.WriteFile("/var/foo.txt", buf, 0644)
</syntaxhighlight>


<syntaxhighlight lang="go">
<syntaxhighlight lang="go">
Line 61: Line 52:
require "os"
require "os"


filepath = "/var/tmp/foo.txt"
contents = []byte("abc")
contents = []byte("abc")
err := os.WriteFile("/var/tmp/foo.txt", contents, 0644)


err := os.WriteFile(filepath, contents, 0644)
conts, err := os.ReadFile("/var/tmp/foo.txt")
 
conts, err := os.ReadFile(filepath)
</syntaxhighlight>
</syntaxhighlight>



Revision as of 20:01, 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, os.EOF):
        // nothing to read (0 bytes)
    case errors.Is(err, os.ErrUnexpectedEOF):
        // end of file, before filling buffer
}
filepath := "/var/tmp/foo.txt"

_, err := os.WriteString(writer, "abcd")

Files

If the files are small, you can work with them using os

require "os"

contents = []byte("abc")
err := os.WriteFile("/var/tmp/foo.txt", contents, 0644)

conts, err := os.ReadFile("/var/tmp/foo.txt")

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