golang原子SwapPointer()无法通过接口运行

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.