package main
import (
"fmt"
"sync/atomic"
"unsafe"
"strconv"
)
type Element interface {
Check() bool
Clear()
}
type S struct {
S string
}
func (s *S) Clear() {}
func (s *S) Check() bool {
return true
}
func NewS() Element {
return &S{"hello"}
}
func main() {
elemList := make([]Element, 10)
for i := 0; i < 10; i++ {
elemList[i] = NewS()
}
elemPointer := (*unsafe.Pointer)(unsafe.Pointer(&(elemList[0])))
elem := atomic.SwapPointer(elemPointer, nil)
fmt.Println(elemList)
fmt.Println(elem)
strList := make([]*string, 10)
for i := 0; i < 10; i++ {
s := strconv.FormatInt(int64(i)+100, 10)
strList[i] = &s
}
strPointer := (*unsafe.Pointer)(unsafe.Pointer(&strList[0]))
strElem := atomic.SwapPointer(strPointer, nil)
fmt.Println(strList)
fmt.Println(strElem)
s := *(*string)(strElem)
fmt.Println(s)
}
I want to implement a lock-free pool. When I use specific type slice, atomic.SwapPointer()
work correctly, but when I use a interface slice, it does not.Why? Above code show the elem
address is completely different from other address of element in elemList
.