github.com/database64128/shadowsocks-go@v1.7.0/mmap/mmap_unixwindows.go (about) 1 //go:build unix || windows 2 3 package mmap 4 5 import ( 6 "os" 7 "unsafe" 8 ) 9 10 // ReadFile maps the named file into memory for reading. 11 func ReadFile[T ~[]byte | ~string](name string) (data T, err error) { 12 f, err := os.Open(name) 13 if err != nil { 14 return 15 } 16 defer f.Close() 17 18 fs, err := f.Stat() 19 if err != nil { 20 return 21 } 22 23 size := fs.Size() 24 if size == 0 { 25 return 26 } 27 28 addr, err := readFile(f, size) 29 if err != nil { 30 return 31 } 32 33 b := unsafe.Slice((*byte)(unsafe.Pointer(addr)), size) 34 return *(*T)(unsafe.Pointer(&b)), nil 35 } 36 37 // Unmap removes the memory mapping. 38 func Unmap[T ~[]byte | ~string](data T) error { 39 if len(data) == 0 { 40 return nil 41 } 42 return unmap(*(*uintptr)(unsafe.Pointer(&data)), len(data)) 43 }