From 39eda0dac12a53f7f0c3189e5929d171e8e0b844 Mon Sep 17 00:00:00 2001 From: Cholerae Hu Date: Fri, 3 Aug 2018 14:49:47 +0800 Subject: [PATCH] net/mail: lazily initialize dateLayouts Saves 6KB of memory in stdlib packages. Updates #26775 Change-Id: I1a6184cefa78e9a3c034fa84506fdfe0fec27add Reviewed-on: https://go-review.googlesource.com/127736 Reviewed-by: Brad Fitzpatrick --- src/net/mail/message.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/net/mail/message.go b/src/net/mail/message.go index 5912b9033477e1..554377aa1da989 100644 --- a/src/net/mail/message.go +++ b/src/net/mail/message.go @@ -26,6 +26,7 @@ import ( "mime" "net/textproto" "strings" + "sync" "time" "unicode/utf8" ) @@ -65,9 +66,12 @@ func ReadMessage(r io.Reader) (msg *Message, err error) { // Layouts suitable for passing to time.Parse. // These are tried in order. -var dateLayouts []string +var ( + dateLayoutsBuildOnce sync.Once + dateLayouts []string +) -func init() { +func buildDateLayouts() { // Generate layouts based on RFC 5322, section 3.3. dows := [...]string{"", "Mon, "} // day-of-week @@ -93,6 +97,7 @@ func init() { // ParseDate parses an RFC 5322 date string. func ParseDate(date string) (time.Time, error) { + dateLayoutsBuildOnce.Do(buildDateLayouts) for _, layout := range dateLayouts { t, err := time.Parse(layout, date) if err == nil {