Skip to content

Instantly share code, notes, and snippets.

@sylr
Created March 25, 2025 19:31
Show Gist options
  • Save sylr/35f48e40dc7f67a166edf0ac0544d9b5 to your computer and use it in GitHub Desktop.
Save sylr/35f48e40dc7f67a166edf0ac0544d9b5 to your computer and use it in GitHub Desktop.
Go sub slice cloning
package main
import (
"bytes"
"fmt"
"unsafe"
)
type Message struct {
buffer []byte
headers []byte // buffer[0:n] sub-slice
body []byte // buffer[n:x] sub-slice
trailers []byte // buffer[x: ] sub-slice
}
func (m *Message) Clone() Message {
m2 := Message{
buffer: make([]byte, len(m.buffer), cap(m.buffer)),
}
copy(m2.buffer, m.buffer)
pBuffer := (uintptr)(unsafe.Pointer(&m.buffer[0]))
pHeaders := (uintptr)(unsafe.Pointer(&m.headers[0]))
pBody := (uintptr)(unsafe.Pointer(&m.body[0]))
pTrailers := (uintptr)(unsafe.Pointer(&m.trailers[0]))
m2.headers = m2.buffer[pHeaders-pBuffer : pHeaders-pBuffer+uintptr(len(m.headers))]
m2.body = m2.buffer[pBody-pBuffer : pBody-pBuffer+uintptr(len(m.body))]
m2.trailers = m2.buffer[pTrailers-pBuffer : pTrailers-pBuffer+uintptr(len(m.trailers))]
return m2
}
func (m *Message) String() string {
pBuffer := (uintptr)(unsafe.Pointer(&m.buffer[0]))
pHeaders := (uintptr)(unsafe.Pointer(&m.headers[0]))
pBody := (uintptr)(unsafe.Pointer(&m.body[0]))
pTrailers := (uintptr)(unsafe.Pointer(&m.trailers[0]))
buf := &bytes.Buffer{}
fmt.Fprintf(buf, "buffer: addr = %p, (uintptr)(unsafe.Pointer(&m.buffer[0])) = %d, len(m.buffer) = %2.d\n", m.buffer, (uintptr)(pBuffer), len(m.buffer))
fmt.Fprintf(buf, "headers: addr = %p, (uintptr)(unsafe.Pointer(&m.headers[0])) = %d, len(m.headers) = %2.d, bufferOffset = %d\n", m.headers, pHeaders, len(m.headers), pHeaders-pBuffer)
fmt.Fprintf(buf, "body: addr = %p, (uintptr)(unsafe.Pointer(&m.body[0])) = %d, len(m.body) = %2.d, bufferOffset = %d\n", m.body, pBody, len(m.body), pBody-pBuffer)
fmt.Fprintf(buf, "trailers: addr = %p, (uintptr)(unsafe.Pointer(&m.trailers[0])) = %d, len(m.trailers) = %2.d, bufferOffset = %d\n", m.trailers, pTrailers, len(m.trailers), pTrailers-pBuffer)
return buf.String()
}
func main() {
m := Message{
buffer: []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
}
m.headers = m.buffer[:3]
m.body = m.buffer[3:6]
m.trailers = m.buffer[6:]
fmt.Printf("m: %p -> %v\n", &m.buffer, m.buffer)
fmt.Printf("m: %p -> %v\n", &m.headers, m.headers)
fmt.Printf("m: %p -> %v\n", &m.body, m.body)
fmt.Printf("m: %p -> %v\n", &m.trailers, m.trailers)
fmt.Print(m.String())
m2 := m.Clone()
fmt.Printf("m2: %p -> %v\n", &m2.buffer, m2.buffer)
fmt.Printf("m2: %p -> %v\n", &m2.headers, m2.headers)
fmt.Printf("m2: %p -> %v\n", &m2.body, m2.body)
fmt.Printf("m2: %p -> %v\n", &m2.trailers, m2.trailers)
fmt.Print(m2.String())
m.buffer[0] = 99
fmt.Printf("m: %p -> %v\n", &m.buffer, m.buffer)
fmt.Printf("m: %p -> %v\n", &m.headers, m.headers)
fmt.Printf("m: %p -> %v\n", &m.body, m.body)
fmt.Printf("m: %p -> %v\n", &m.trailers, m.trailers)
fmt.Printf("m2: %p -> %v\n", &m2.buffer, m2.buffer)
fmt.Printf("m2: %p -> %v\n", &m2.headers, m2.headers)
fmt.Printf("m2: %p -> %v\n", &m2.body, m2.body)
fmt.Printf("m2: %p -> %v\n", &m2.trailers, m2.trailers)
fmt.Print(m2.String())
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment