Commit 35bda67d authored by Caleb Spare's avatar Caleb Spare Committed by Rob Pike

time: add Time.AppendFormat

This is a version of Time.Format that doesn't require allocation.

This is an updated version of 0af302f5
submitted by @bradfitz which was later rolled back.

Fixes #5192
Updates #5195

Change-Id: I4e6255bee1cf3914a6cc8d9d2a881cfeb273c08e
Reviewed-on: https://go-review.googlesource.com/1760Reviewed-by: default avatarRob Pike <r@golang.org>
parent 08c43488
...@@ -410,6 +410,22 @@ func (t Time) String() string { ...@@ -410,6 +410,22 @@ func (t Time) String() string {
// about the formats and the definition of the reference time, see the // about the formats and the definition of the reference time, see the
// documentation for ANSIC and the other constants defined by this package. // documentation for ANSIC and the other constants defined by this package.
func (t Time) Format(layout string) string { func (t Time) Format(layout string) string {
const bufSize = 64
var b []byte
max := len(layout) + 10
if max < bufSize {
var buf [bufSize]byte
b = buf[:0]
} else {
b = make([]byte, 0, max)
}
b = t.AppendFormat(b, layout)
return string(b)
}
// AppendFormat is like Format but appends the textual
// representation to b and returns the extended buffer.
func (t Time) AppendFormat(b []byte, layout string) []byte {
var ( var (
name, offset, abs = t.locabs() name, offset, abs = t.locabs()
...@@ -419,16 +435,7 @@ func (t Time) Format(layout string) string { ...@@ -419,16 +435,7 @@ func (t Time) Format(layout string) string {
hour int = -1 hour int = -1
min int min int
sec int sec int
b []byte
buf [64]byte
) )
max := len(layout) + 10
if max <= len(buf) {
b = buf[:0]
} else {
b = make([]byte, 0, max)
}
// Each iteration generates one std value. // Each iteration generates one std value.
for layout != "" { for layout != "" {
prefix, std, suffix := nextStdChunk(layout) prefix, std, suffix := nextStdChunk(layout)
...@@ -568,7 +575,7 @@ func (t Time) Format(layout string) string { ...@@ -568,7 +575,7 @@ func (t Time) Format(layout string) string {
b = formatNano(b, uint(t.Nanosecond()), std>>stdArgShift, std&stdMask == stdFracSecond9) b = formatNano(b, uint(t.Nanosecond()), std>>stdArgShift, std&stdMask == stdFracSecond9)
} }
} }
return string(b) return b
} }
var errBad = errors.New("bad value for field") // placeholder not passed to user var errBad = errors.New("bad value for field") // placeholder not passed to user
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment