Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
G
golang
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
go
golang
Commits
7bb335c7
Commit
7bb335c7
authored
Mar 06, 2009
by
Rob Pike
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
document io
R=rsc DELTA=44 (30 added, 4 deleted, 10 changed) OCL=25819 CL=25835
parent
5b4fa1ad
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
39 additions
and
13 deletions
+39
-13
bytebuffer.go
src/lib/io/bytebuffer.go
+14
-7
io.go
src/lib/io/io.go
+21
-5
pipe.go
src/lib/io/pipe.go
+4
-1
No files found.
src/lib/io/bytebuffer.go
View file @
7bb335c7
...
...
@@ -4,15 +4,13 @@
package
io
//
Byte buffer for marshaling nested messages
.
//
Simple byte buffer for marshaling data
.
import
(
"io"
;
"os"
;
)
// A simple implementation of the io.Read and io.Write interfaces.
// A newly allocated ByteBuffer is ready to use.
// TODO(r): Do better memory management.
...
...
@@ -24,6 +22,9 @@ func bytecopy(dst []byte, doff int, src []byte, soff int, count int) {
}
}
// A ByteBuffer is a simple implementation of the io.Read and io.Write interfaces
// connected to a buffer of bytes.
// The zero value for ByteBuffer is an empty buffer ready to use.
type
ByteBuffer
struct
{
buf
[]
byte
;
off
int
;
// Read from here
...
...
@@ -31,11 +32,14 @@ type ByteBuffer struct {
cap
int
;
}
// Reset resets the buffer so it has no content.
func
(
b
*
ByteBuffer
)
Reset
()
{
b
.
off
=
0
;
b
.
len
=
0
;
}
// Write appends the contents of p to the buffer. The return
// value is the length of p; err is always nil.
func
(
b
*
ByteBuffer
)
Write
(
p
[]
byte
)
(
n
int
,
err
*
os
.
Error
)
{
plen
:=
len
(
p
);
if
len
(
b
.
buf
)
==
0
{
...
...
@@ -54,6 +58,8 @@ func (b *ByteBuffer) Write(p []byte) (n int, err *os.Error) {
return
plen
,
nil
;
}
// Read reads the next len(p) bytes from the buffer or until the buffer
// is drained. The return value is the number of bytes read; err is always nil.
func
(
b
*
ByteBuffer
)
Read
(
p
[]
byte
)
(
n
int
,
err
*
os
.
Error
)
{
plen
:=
len
(
p
);
if
len
(
b
.
buf
)
==
0
{
...
...
@@ -71,22 +77,23 @@ func (b *ByteBuffer) Read(p []byte) (n int, err *os.Error) {
return
plen
,
nil
;
}
// Len returns the length of the underlying buffer.
func
(
b
*
ByteBuffer
)
Len
()
int
{
return
b
.
len
}
// Off returns the location within the buffer of the next byte to be read.
func
(
b
*
ByteBuffer
)
Off
()
int
{
return
b
.
off
}
// Data returns the contents of the unread portion of the buffer.
func
(
b
*
ByteBuffer
)
Data
()
[]
byte
{
return
b
.
buf
[
b
.
off
:
b
.
len
]
}
func
(
b
*
ByteBuffer
)
AllData
()
[]
byte
{
return
b
.
buf
[
0
:
b
.
len
]
}
// NewByteBufferFromArray creates and initializes a new ByteBuffer
// with buf as its initial contents.
func
NewByteBufferFromArray
(
buf
[]
byte
)
*
ByteBuffer
{
b
:=
new
(
ByteBuffer
);
b
.
buf
=
buf
;
...
...
src/lib/io/io.go
View file @
7bb335c7
...
...
@@ -2,6 +2,11 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// This package provides basic interfaces to I/O primitives.
// Its primary job is to wrap existing implementations of such primitives,
// such as those in package os, into shared public interfaces that
// abstract the functionality.
// It also provides buffering primitives and some other basic operations.
package
io
import
(
...
...
@@ -9,35 +14,43 @@ import (
"syscall"
;
)
// ErrEOF is the error returned by Readn and Copyn when they encounter EOF.
var
ErrEOF
=
os
.
NewError
(
"EOF"
)
// Read is the interface that wraps the basic Read method.
type
Read
interface
{
Read
(
p
[]
byte
)
(
n
int
,
err
*
os
.
Error
);
}
// Write is the interface that wraps the basic Write method.
type
Write
interface
{
Write
(
p
[]
byte
)
(
n
int
,
err
*
os
.
Error
);
}
// Close is the interface that wraps the basic Close method.
type
Close
interface
{
Close
()
*
os
.
Error
;
}
// ReadWrite is the interface that groups the basic Read and Write methods.
type
ReadWrite
interface
{
Read
;
Write
;
}
// ReadClose is the interface that groups the basic Read and Close methods.
type
ReadClose
interface
{
Read
;
Close
;
}
// WriteClose is the interface that groups the basic Write and Close methods.
type
WriteClose
interface
{
Write
;
Close
;
}
// ReadWriteClose is the interface that groups the basic Read, Write and Close methods.
type
ReadWriteClose
interface
{
Read
;
Write
;
...
...
@@ -53,11 +66,12 @@ func StringBytes(s string) []byte {
return
b
;
}
// WriteString writes the contents of the string s to w, which accepts an array of bytes.
func
WriteString
(
w
Write
,
s
string
)
(
n
int
,
err
*
os
.
Error
)
{
return
w
.
Write
(
StringBytes
(
s
))
}
// Read
until buffer is full, EOF, or error
// Read
n reads r until the buffer buf is full, or until EOF or error.
func
Readn
(
r
Read
,
buf
[]
byte
)
(
n
int
,
err
*
os
.
Error
)
{
n
=
0
;
for
n
<
len
(
buf
)
{
...
...
@@ -86,6 +100,8 @@ func (fr *fullRead) Read(p []byte) (n int, err *os.Error) {
return
n
,
err
}
// MakeFullReader takes r, an implementation of Read, and returns an object
// that still implements Read but always calls Readn underneath.
func
MakeFullReader
(
r
Read
)
Read
{
if
fr
,
ok
:=
r
.
(
*
fullRead
);
ok
{
// already a fullRead
...
...
@@ -94,8 +110,8 @@ func MakeFullReader(r Read) Read {
return
&
fullRead
{
r
}
}
// Copies n bytes (or until EOF is reached) from src to dst.
//
R
eturns the number of bytes copied and the error, if any.
// Cop
y n cop
ies n bytes (or until EOF is reached) from src to dst.
//
It r
eturns the number of bytes copied and the error, if any.
func
Copyn
(
src
Read
,
dst
Write
,
n
int64
)
(
written
int64
,
err
*
os
.
Error
)
{
buf
:=
make
([]
byte
,
32
*
1024
);
for
written
<
n
{
...
...
@@ -130,8 +146,8 @@ func Copyn(src Read, dst Write, n int64) (written int64, err *os.Error) {
return
written
,
err
}
// Copies from src to dst until EOF is reached.
//
R
eturns the number of bytes copied and the error, if any.
// Cop
y cop
ies from src to dst until EOF is reached.
//
It r
eturns the number of bytes copied and the error, if any.
func
Copy
(
src
Read
,
dst
Write
)
(
written
int64
,
err
*
os
.
Error
)
{
buf
:=
make
([]
byte
,
32
*
1024
);
for
{
...
...
src/lib/io/pipe.go
View file @
7bb335c7
...
...
@@ -169,7 +169,10 @@ func (w *pipeWrite) finish() {
w
.
Close
();
}
// Create a synchronous in-memory pipe.
// Pipe creates a synchronous in-memory pipe.
// Used to connect code expecting an io.Read
// with code expecting an io.Write.
//
// Reads on one end are matched by writes on the other.
// Writes don't complete until all the data has been
// written or the read end is closed. Reads return
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment