Skip to content

Instantly share code, notes, and snippets.

@totoleo
Last active February 13, 2019 02:30
Show Gist options
  • Save totoleo/4263ac66925b3d28f56fe45e398fcc21 to your computer and use it in GitHub Desktop.
Save totoleo/4263ac66925b3d28f56fe45e398fcc21 to your computer and use it in GitHub Desktop.
a Pitfall of slice in golang
package main
import (
"fmt"
"strings"
"unsafe"
)
func main() {
s := make([]int, 10, 20)
size := unsafe.Sizeof(0)
fmt.Printf("s address:%p\n", &s)
fmt.Printf("%x\n", *(*uintptr)(unsafe.Pointer(&s)))
fmt.Println("s len:",*(*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&s)) + size)))
fmt.Println("s cap:",*(*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&s)) + size*2)))
slice(s)
s1 := s
fmt.Printf("s1 origin:%p\n", &s1)
fmt.Printf("%x\n", *(*uintptr)(unsafe.Pointer(&s1)))
fmt.Println(*(*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&s1)) + size)))
fmt.Println(*(*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&s1)) + size*2)))
fmt.Println(strings.Repeat("-", 50))
*(*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&s1)) + size)) = 20
fmt.Printf("%x\n", *(*uintptr)(unsafe.Pointer(&s)))
fmt.Println(*(*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&s)) + size)))
fmt.Println(*(*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&s)) + size*2)))
fmt.Printf("s1 large:%x\n", *(*uintptr)(unsafe.Pointer(&s1)))
fmt.Println(*(*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&s1)) + size)))
fmt.Println(*(*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&s1)) + size*2)))
fmt.Println("s:",s)
fmt.Println("s1:",s1)
}
func slice(s []int) {
s[9]=1
s=append(s,12)
ss:=make([]int,12)
s=append(s,ss...)
s[11]=19
size := unsafe.Sizeof(0)
fmt.Printf("func address:%p\n", &s)
fmt.Printf("%x\n", *(*uintptr)(unsafe.Pointer(&s)))
fmt.Println("func len:",*(*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&s)) + size)))
fmt.Println("func cap:",*(*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&s)) + size*2)))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment