title: Efficient way to read Mmap
body: <p>I am using <code>syscall</code> to read a byte array out of <code>mmap</code>:</p>
  
  <pre><code>file, e := os.Open(path)
  if e != nil {...}
  defer file.Close()
  
  fi, e := file.Stat()
  if e != nil {...}
  data, e := syscall.Mmap(int(file.Fd()), 0, int(fi.Size()), syscall.PROT_READ, syscall.MAP_SHARED)
  if e != nil {...}
  </code></pre>
  
  <p><code>data</code> is the binary array I need.</p>
  
  <p>I am using <code>||</code> as a delimiter, so I can get slices by using <code>bytes.Split</code>:</p>
  
  <pre><code>slices := bytes.Split(data, []byte("||"))
  for _, s := range slices {
      str := string(s[:])
      fmt.Println(str)
  }
  </code></pre>
  
  <p>This works fine, and I also stored the total number of messages (its type is <code>uint32</code> which takes 8 bytes) at the beginning of the <code>mmap</code>.</p>
  
  <p>When a new message is written in, I can get the total number of messages by reading the first 8 bytes.</p>
  
  <p>Assuming I have the number of messages as <code>n</code>, I still need to do the following to read the new message:</p>
  
  <pre><code>slices := bytes.Split(data, []byte("||"))
  s := slices[n - 1]
  str := string(s[:])
  fmt.Println(str)
  </code></pre>
  
  <p>Is there a more efficient way to do this?</p>