Skip to content

Instantly share code, notes, and snippets.

@jnovikov
Created April 21, 2019 10:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jnovikov/3851829769cb05f3264a0d2291f9e296 to your computer and use it in GitHub Desktop.
Save jnovikov/3851829769cb05f3264a0d2291f9e296 to your computer and use it in GitHub Desktop.
Interfaces and structs
package main
import (
"errors"
"io"
"os"
"strings"
"unicode"
)
const maxBufferSize = 512 * 1024
func readString(r io.Reader) (string, error) {
buffer := make([]byte, 0)
one := []byte{0}
for n, err := r.Read(one); n > 0 && err == nil; n, err = r.Read(one) {
if one[0] == '\n' {
return string(buffer), nil
} else {
buffer = append(buffer, one[0])
}
if len(buffer) > maxBufferSize {
return string(buffer), errors.New("too_big_string")
}
}
return "", errors.New("Can't find \\n")
}
type AReader struct {
}
func (a *AReader) Read(b []byte) (int, error) {
for k := range b {
b[k] = 'A'
}
return len(b), nil
}
type rot13Reader struct {
r io.Reader
}
func (rot *rot13Reader) Read(b []byte) (int, error) {
n, err := rot.r.Read(b)
for k := range b {
if unicode.IsLetter(rune(b[k])) {
start := 'a'
if b[k] >= 'A' && b[k] <= 'Z' {
start = 'A'
}
pos := (b[k] - byte(start) + 13) % 26
b[k] = byte(start) + pos
}
}
return n, err
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment