54 lines
781 B
Go
54 lines
781 B
Go
package main
|
|
|
|
import "fmt"
|
|
|
|
type Builder struct {
|
|
buffer []byte
|
|
}
|
|
|
|
func NewBuilder() Builder {
|
|
return Builder{}
|
|
}
|
|
|
|
func (b *Builder) Grow(capacity int) {
|
|
if capacity < 0 {
|
|
return
|
|
}
|
|
|
|
if capacity < len(b.buffer) {
|
|
b.buffer = b.buffer[:capacity]
|
|
return
|
|
}
|
|
|
|
buffer := make([]byte, len(b.buffer), capacity)
|
|
copy(buffer, b.buffer)
|
|
b.buffer = buffer
|
|
}
|
|
|
|
func (b *Builder) Write(symbol byte) {
|
|
b.buffer = append(b.buffer, symbol)
|
|
}
|
|
|
|
func (b *Builder) At(index int) *byte {
|
|
if index < 0 || index >= len(b.buffer) {
|
|
return nil
|
|
}
|
|
|
|
return &b.buffer[index]
|
|
}
|
|
|
|
func (b *Builder) String() string {
|
|
return string(b.buffer)
|
|
}
|
|
|
|
func main() {
|
|
builder := NewBuilder()
|
|
builder.Grow(3)
|
|
|
|
builder.Write('a')
|
|
builder.Write('b')
|
|
builder.Write('c')
|
|
|
|
fmt.Println(builder.String())
|
|
}
|