package mining import ( "bytes" "encoding/json" "sync" ) // buffer := jsonBufferPool.Get().(*bytes.Buffer) // buffer.Reset() // defer jsonBufferPool.Put(buffer) var jsonBufferPool = sync.Pool{ New: func() any { return bytes.NewBuffer(make([]byte, 0, 1024)) }, } // buffer := acquireJSONBuffer() // defer releaseJSONBuffer(buffer) func acquireJSONBuffer() *bytes.Buffer { buffer := jsonBufferPool.Get().(*bytes.Buffer) buffer.Reset() return buffer } // releaseJSONBuffer(buffer) returns the buffer to the pool when it stays under 64 KB. func releaseJSONBuffer(buffer *bytes.Buffer) { if buffer.Cap() <= 65536 { jsonBufferPool.Put(buffer) } } // UnmarshalJSON(data, &message) func UnmarshalJSON(data []byte, target interface{}) error { return json.Unmarshal(data, target) } // data, err := MarshalJSON(stats) // safe to keep after the call returns. func MarshalJSON(value interface{}) ([]byte, error) { buffer := acquireJSONBuffer() defer releaseJSONBuffer(buffer) encoder := json.NewEncoder(buffer) // Keep characters like < and > unchanged so API responses match json.Marshal. encoder.SetEscapeHTML(false) if err := encoder.Encode(value); err != nil { return nil, err } // json.Encoder.Encode adds a newline; trim it so callers get compact JSON. data := buffer.Bytes() if len(data) > 0 && data[len(data)-1] == '\n' { data = data[:len(data)-1] } result := make([]byte, len(data)) copy(result, data) return result, nil }